• ベストアンサー

SQL関数とレスポンスについて

業務でJavaとDB(DB2)を使用しています。 最近、SQL関数を使用すべきか否かでちょっと悩んでいます。 SQL関数は確かに便利ですが、使いすぎるとレスポンスが悪くなる、ということはあるのでしょうか? 今はSQLは出来るだけシンプルにして、Javaで補っています。 (例えばGraphic項目から全角スペースを取り除く場合はSQL関数のRTRIMを使わず、DBから取り出した後にJavaで取り除く、など) ご指導よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ishi00
  • ベストアンサー率83% (10/12)
回答No.4

>私が知りたいのはコーディング時、SQL関数(RTRIM、nullだったら別の値に置き換えるValue関数など)をふんだんに使って問題ないのか、それともSQLは最小限にしてデータの編集などはJavaで行ったほうがいいのか、ということです。 RTRIMに関しては特に性能落ちる要素が見当たりませんので、使って良いと思いますが、後はプロジェクトでDB担当している人に聞いたほうが良いと思います。 言えるのは関数によってはインデックスを使いようがないケースが出てくるので性能が出ない場合があるということです。 どんな関数を使えばインデックスを使わないかはBtreeインデックスの仕組みを考えれば大体想像はつくと思いますが、分からないうちはアクセスパスとか見て検証すれば良いと思います。 DB得意な人から見ればSQLで解決したほうが良い問題もJAVAが得意な人から見ればJAVAで解決したほうが良いということもあると思います。 僕はDBよりなのでSQL関数はじゃんじゃん使うほうです。

deaf1010
質問者

お礼

なるほど・・・どうもありがとうございます。 今後のコーディングの指針とさせて頂きます。

その他の回答 (3)

  • ishi00
  • ベストアンサー率83% (10/12)
回答No.3

#2です。 少し補足します。 統計情報(runstatsコマンド)はとっていますか? もしやっていない場合はrunstatsコマンドを実行することでパフォーマンスが改善する場合が多いです。 runstats on table <schema>.<table> and indexes all

deaf1010
質問者

お礼

情報、どうもありがとうございます。 ただ、私はDBのカスタマイズは業務ではやっていないです。 私が知りたいのはコーディング時、SQL関数(RTRIM、nullだったら別の値に置き換えるValue関数など)をふんだんに使って問題ないのか、それともSQLは最小限にしてデータの編集などはJavaで行ったほうがいいのか、ということです。

  • ishi00
  • ベストアンサー率83% (10/12)
回答No.2

概ね#1さんの言うとおりだと思いますが・・・。 RTRIM()は大概の場合インデックスを使ってくれると思います。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

使い方によります。 Aにインデックスが張ってあるとき、 ○ select A from テーブル where A=RTRIM('123 ') × select A from テーブル where RTRIM(A)='123' 下の場合、インデックスが設定されている項目に関数を使用すると、インデックスが使用されなくなります。 このため、速度低下が起こります。

関連するQ&A

  • アクセスの関数のご教授を

    いつも、ご指導有難うございます。 アクセス2007で更新クエリを使用しています。 データは主に顧客データですが、顧客名のフィールド(データは外部からCSVでインポートしたものです)会社名の前と後ろに余分なスペースが入っています。 Trim関数、Ltrim関数、RTrim関数を使用して後ろにあったスペースは消すことが出来たのですが、どうしても文字列の前にあるスペースが消去できません。(Ltrim関数を使用しました) データをみると「" "ABC商事」のように" "が消えません。 何か使用方法に違いがあるのでしょうか。 ご指導をお願い致します。

  • SQLについて

    SQLには Transact-SQL、MySQL、PostgreSQL、PL/SQLといったように種類があります。 使用できる関数が違うとかは分かるのですが、 具体的に何がどう違うかなどははっきり理解できていません。 また、どのSQLをどのような用途で使用するのかなども分かっていません。 また、これに関することで、DBでSQLServerとかOracleとかが関わっていると思われるのですが。 例えば、SQLServerではTransact-SQLを使用して、Oracleでは別のSQL(ここはよく分かっていません)を使用するみたいなことでしょうか? 要はSQLというものがあって、それをコーディングするためのアプリケーションに対応しているものが、各SQLといった事? 例えば、C#、VBA、Java(Transact-SQL、MySQL)などのプログラミング言語(SQL)があって それを使用できるアプリケーションはそれぞれ VisualStudio、Excel、eclipse(SQLServer、Oracle)みたいな意味合いなんでしょうか? よく分からない質問と例えになってしまいましたが、ご回答のほうをよろしくお願いします。

  • 末尾の全角スペースの削除

    SQL Server 2008環境です。 文字列の末尾の空白を一括して削除したくて、以下のようなクエリを書きました。 UPDATE TEST_TABLE SET NAME = REPLACE(RTRIM(REPLACE(StoreBranchName, ' ', ' ')), ' ', ' ') 全角スペースを一度半角スペースにして、RTRIMをかけた後、最後に 半角スペースを全角に直すというものです。 しかし、これだと、元々半角スペースが入っていた場合、そっちまで全角スペースに なってしまうため悩んでおります。 うまいやり方を教えていただけないでしょうか。 宜しくお願いします。

  • ORACLEの「DECODE」と同じ意味の関数が知りたい

    SQL serverを使用しています。 ORACLEのDECODEに相当する関数を使用したいのですが、 わからなくて困っています。 具体的には、 特定の行に対して「全角スペース」もしくは「半角スペース」があったときに、nullに置換したい。 (なるべくシンプルな方法で!!) 教えてください。

  • 右側の半角スペースのみ取り除く

    VB6にて右側の半角スペースのみを取り除く関数を作りたいと思うのですが、Rtrimを行うと全角スペースまでも削除されてしまうので困っています。 何方か正確に半角スペースのみを取り除く良い方法はございますでしょうか。

  • SQL文の関数らしいのですが、意味を正確に調べたいとき。

    Visual Basic で組んだ業務ソフトのソースを見ているところなのですが…。データベースは SQL Serverを使っています。その中のコードとして SQL = "SELECT * FROM MPGSUB " _ & "WHERE 端末ID = " & Conv_DBValue(Client_ID, DB_String) というのがあります。これは、《"端末ID"列から、DB_Stringの型に変換した値をClient_ID という列名にして取得する》ということで良いのでしょうか。 Conv_DBValue やDB_String は、手元の辞典にも載っていないし、ネットで検索しても解説しているところがありません。このようなときは、プログラムで参照すべき他のモジュールが足りないと考えた方が良いのでしょうか。 ときどき調べがつかない関数があるので困ってしまうので、そのような時はどうすべきか教授願いたいです。(^^;

  • PreparedStatementのレスポンスの改善策を教えて下さい。

    現在、あるWEBシステムの開発に携わっているものですが、 DBの検索が非常に遅いという問題にぶつかっている状態です。 そこで、問題点をできるだけ明確にするために 下記の3パターンで計測を試みてみました。   (1) Statement クラスの executeQueryメソッドを使用してのデータ取得   (2) PreparedStatement クラスの executeQueryメソッドを使用してのデータ取得     ※但し、バインド変数を使用しない。   (3) PreparedStatement クラスの executeQueryメソッドを使用してのデータ取得     ※但し、バインド変数を使用する。 計測は、次の条件で行いました。    3つ全てが同一のSQL。    (バインド変数を使用する場合も、最終的には同じ静的SQLになるようにする。)    時間はexecuteQueryメソッドの前後で計測する。    (executeQueryメソッドコールの直前と直後の時間の差とします。) 結果は(1)、(2)では、約3秒程度とほぼ同タイム。しかし、(3)はでは1時間経ってもレスポンスが返ってこない状況でした。 これはどういう理由が考えられるのでしょうか。今、ここから先に進めなくて大変困っています。 同じような現象に遭遇した経験をお持ちの方、もしくは、この先どのように解析を進めるべきなのか示唆できる方。アドバイスをどうかよろしくお願い致します。 なお、計測は下記の環境にて行っております。   OS:Windows XP Pro   WAS:WebSphere 5.0.2   DB:DB2 Version 7   java:java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1)   JDBCドライバ:Version 2.0 (使用クラス:COM.ibm.db2.jdbc.app.DB2Driver)

  • Lag関数はないのでしょうか?

    SQLServer2005を使用しています。 OracleでいうところのLag関数とおなじような関数は、SQLServerにはないのでしょうか? オラクルと同じようにSQLを書くと、「組込関数ではない」とエラーが出てしまいます。 自分で調べて、以下のURLのように記述してみると、今度は「Rows付近に不適切な構文があります。」と言われてしまいます。。。 http://oraclesqlpuzzle.hp.infoseek.co.jp/db2/db2-8-1.html SQLServerでは、実現できないのでしょうか?

  • PL/SQLで文字列を分割

    PL/SQLで、CSVファイルを読み込んでDBにデータを登録しようとしています。 CSVの1行を読み込んだあと、 カンマで区切ってリストに格納してくれるような 便利な関数は無いのでしょうか? 1行の先頭から1文字づつカンマかどうか調べて取り出す、よりも簡単な方法があれば是非教えて下さい。

  • oracle,sql-server,DB2,フリーDB

    oracle 10g sql-server 2005 DB2 フリーDB(mysqlなど) はどれがいいでしょうか? 一応3年ぐらい前までは開発現場にいたので一通り知っています。 すべて経験ありますが管理はしたことはありません。 価格ならフリーが一番でしょう。信頼性で言うとoracle でもコストが高い。 MSとくっつくならsql-serverだと思うのですが。 まだ社内でどの程度の規模になるかも把握し切れていませんが、 やはり無難にoraが一番でしょうか?? 後々に業務システムの開発をします。 javaにするかVB,delphiなどにするかも決まってません。 DB2なら一応資格も持っているんですけどね。 管理、構築の容易さなどそれぞれの特徴も教えてください。