• 締切済み

oracleのSQLパフォーマンスについて

oracleのSQLパフォーマンスについて質問です。 当方、SQLは初めてで、ずぶの素人ですが、SQLパフォーマンスを改善することになりました。 質問の仕方も悪いとは思いますが、お力添えをいただきたいと思います。 【質問1】 DBのレコード件数は、SQLパフォーマンスにどう影響するでしょうか?以下例のようなことが知りたいです。 例1 INDEXのないテーブルに対しSQLを発行する場合、レコード件数の多いDBとレコード件数の少ないDBでは、レコード件数が少ない方が、パフォーマンスが良い? (前提として、検索対象DBは、レコード件数以外に差がないとする) 例2 WHERE句にINDEX項目を使用した場合、DBのレコード件数はパフォーマンスに影響しない (前提として、アクセスパスは適切で、検索対象をうまく絞り込むことができる) 例3 WHERE句にINDEX項目を使用したSQLをレコード件数の多いDBに発行する場合と、WHERE句にINDEX項目がないSQLをレコード件数の少ないDBに発行する場合では、どちらがパフォーマンスがよいのか (前提として検索対象DBは、レコード件数以外に差がないとする) 【質問2】 INDEXをDBに追加すると、INSERT、UPDATE、DELETEの際に、どのくらい影響するのでしょうか? 対象のDBは、5項目あり、400万件くらいのレコードがあります。また、複合項目(2項目)のプライマリキーと、単一INDEXがついており、新たに3項目の複合INDEXを追加しようとしています。 以上、よろしくお願いいたします。

  • Oracle
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

Oracleのバージョンの記載が無いため、最新版という解釈で回答しますね。 質問1のポイントは、SQL文の実行計画が低コストで実施されるよう書いてあるかが大前提ですので、explain planや、SQLトレースを使用して、低コストになるようSQLを書きなおす、そしてテストを行い、再度トレースを採取し・・の繰り返しでチューニングを行うのがベターかと。 ちなみにですが、where句にインデックス項目が使用されていても、その項目が型変換されるよう書き方をされている場合インデックスが使用されなくなる可能性がありますのでご注意下さい。 質問2ですが、これは一概に「こうだ!」という説明は難しいと思います。(詳細な環境説明が無いため回答しにくいです) また、これはDB全般に言えることですが、1つのSQLをチューニングしていくのはなく、もっと多くなくくりでチューニングをして行ったほうが早い場合もあります。 それには、スタッツパック等のツールを使用します。 それには、CPUの負荷はどれくらいか、ディスクのIO待ちは発生していないか、キャッシュメモリに余裕があるか、バッファヒット率が高いか、一番遅いSQLは何か、ナドナド、様々な情報が出てくるツールですので、それを元に「システム自体のチューニング」を実施していったほうが良いと思います。 乱文乱筆失礼しました。 また、参考にならかったらスミマセン。

関連するQ&A

  • SQLチューニング

    教えて下さい。 検索文のWHERE句を設定、 (1)INDEX付きの項目を1つだけ指定する。 <例>WHERE 項目a = 'a' --対象件数少 (2)INDEX付きの項目を複数個指定する。 <例>WHERE 項目a = 'a' --対象件数少 AND 項目A = 'A' --対象件数多 どちらが検索速度は速いのですか? ご解答よろしくお願いいたします。

  • あいまい検索のパフォーマンス向上について

    あいまい検索(部分一致)検索をする際に、あいまい検索だとインデックスも効かないので、インデックスを張ってパフォーマンス向上という訳にもいかず、パフォーマンスが非常に悪くて困っています。 状況としては、WEBアプリケーションで、検索画面から検索条件を入力し、「Find」ボタンを押下するとJavaでSQLを発行し、Oracleへ接続するという仕組みのシステムです。 下記のようなケースで、後者のSQLに変更するとガツンとパフォーマンスが向上したのですが、偶然でしょうか? 【もともとのSQL】 select name ,age ,sex ,blood_type ,address from TABLE1 where age >= 20 and age < 30 and blood_type = 'A' and name like '%山%' and address like '%中央区%' / 【パフォーマンスが向上したSQL】 select * from (select name ,age ,sex ,blood_type ,address from TABLE1 where age >= 20 and age < 30 and blood_type = 'A' ) where name like '%山%' and address like '%中央区%' / というふうに、あいまい検索部分を別出ししました。 WHERE句の条件をANDでたくさんつなげる際に、2度の問い合わせにはなりますが、一度あいまい検索以外の条件で絞り込んで、それから再度その結果に対してあいまい検索を実施した方が早いのではないかと思ってやったところ実際に早くなったのですが、これは偶然でしょうか? 件数が増えると逆に遅くなるとかだと、逆効果なので、理論的にはどうなのか、ご存知の方がいらっしゃったら教えてください。 また、実際にはテーブルではなく、VIEWに対しての検索で実施しました。 よろしくお願い致します。

  • ORACLEでのSQLのWHERE句について

    はじめまして。 ORACLEに限ったことではないかもしれませんが、 例えば次のようなWHERE句、 WHERE A=B AND C<D AND E<>F この時、各比較項目の並びを変えることによってパフォーマンス に違いが出ているような気がしているんですが、 この辺りの内容が書かれている記事等、知っていらっしゃる方 いませんでしょうか? 宜しくお願い致します。

  • SQLの速度をあげるには・・・

    テキストファイルからキーワードを拾って SQLをなげています SQLの質問になってしまうかもしれません いまはADO接続でやっています Open ファイル as input...... SQL = select * from tbl where name like '%キーワード%' execute(SQL) レコードセットの値で処理をいろいろ・・・ Loop もともとのDBの件数がものすごくおおくてselect文に結構な時間が かかってしまいます。速度をあげるほうほうってあるのでしょうか 私にはおもいつかなくて・・・ こういったほうほうは どう? ってのがありましたら おしえていただきたいのですが よろしくおねがいします。

  • 表の結合(性能)

    2つのテーブルを(内部)結合させる場合、 INNER JOINによる結合と WHERE句に結合条件を記述する2通りの方法が あると思いますが、どちらが早いのでしょうか? なお、Oracle9i、ルールベースにて構築されています。 テーブルの内容、SQL文は下記のとおりです。 ご教授よろしくお願いします。 ■表 A 項目A-1 ・・・PRIMARY KEY1、INDEX1 項目A-2 ・・・PRIMARY KEY2、INDEX2 項目A-3 ・・・PRIMARY KEY3 項目A-4 ■表 B 項目B-1 ・・・PRIMARY KEY1、INDEX1 項目B-2 ・・・PRIMARY KEY2、INDEX2 項目B-3 ・・・PRIMARY KEY3 項目B-4 ※項目A-1と項目B-1にて結合。  項目A-2が"01"と等しいレコード。 表Aのレコード件数>表Bのレコード件数 【WHERE句にて結合】 SELECT * FROM A,B where A.項目1 = B.項目1 and A.項目2 = '01' 【INNER JOINにて結合】 SELECT * FROM A INNER JOIN A ON A.項目1 = B.項目1 AND A.項目2 = '01'

  • アクセスVBAでオラクルにつないだときのSQL記載方法

    教えてください。 アクセスのVBAでオラクルにつないで命令を発行しています。 検索がしたいのですが、 stSQL = "select * from DB where AA = '" & n1 & "'" は、うまくいきますが、あいまい検索の場合はどのようにかけばよいでしょうか? stSQL = "select * from DB where AA = '" & n1% & "'"とか、 stSQL = "select * from DB where AA = '" & n1 & "' & "%"" とかはうまくいきません。 そもそも、"や&や'の意味がいまいちわかっていないのですが・・、 どなたかあいまい検索の記載方法をご伝授下さい。 宜しくお願いします。

  • オラクル結合SQL

    こんばんわ。オラクル初心者です。 オラクル9.1で、下記のようにtable1とtable2を結合して、view1(oracleビュー) を作成したいのですが、どのようなSQLがよいでしょうか。 なかなかうまい方法がなくてこまっています。 table1 no 項目 その他 その他1 1   1 1  2 1  3 .....省略 table2 no 項目 種別 結果 1  1  01  3 1  1  02   8 1  1   03  7 1  2  01  9 1  2   02   6 1  2  03  2 1  3  01   1 ...... view1 良い例 no 項目 結果1 結果2 結果3 1   1   3   8   7    ←種別01 02 03を順にいれる 1   2  9   6  2 1  3  1............ select table1.no,table1.項目,・・・ from table1,table2 where table1.no = table2.no and table1.項目 = table2.項目 ↑おおよそこのような感じになるとは思ってます。 何とか頑張ったのですが、下記のようになってしまうことが 多かったです・・・。どこかSQLがわるいようです。 view1 悪い例 no 項目 結果1 結果2 結果3 1  1   3   8  7 1  1   3   8  7 1  1   3   8  7 1   2  9  6  2 1   2  9  6  2 1   2  9  6  2 1   3  1............ もしご存知の方いらっしゃいましたら、助かります。よろしくお願いいたします。

  • iserease のDB2 UDBに対してODBC接続のVBAでSQL

    iserease のDB2 UDBに対してODBC接続のVBAでSQLを書いています。 下の構文のWHERE句に対しOR条件を加えると 読むレコードがゼロ件になってしまいました。 QSQL = QSQL & " WHERE TNO='" & PTNO & "'" QSQL = QSQL & " OR TNO='" & PSPC & "'" 1行目のPTNOの指定だけだと抽出できます。 なぜでしょうか。よろしくお願いします。

  • where条件内のin句について

    質問です。 where code in(select code from list where ....) ------------------------------------------ といったwhere句がある場合ですが、 in句でヒットしている件数が5000件を超えているため SQLを発行してもタイムアウトでエラーになります。 何か回避策はないでしょうか? よろしくお願いします。

  • SQL文にて・・・

    質問があります。PostgreSQLです。 テーブル(test_tbl)があるとします。 テーブル構成は --------------------------- id ===== char(16) [英数文字格納] point ==== int2 add_date ==== timestamp --------------------------- このテーブルから idが2文字目から'di6ek68dh5ls7g'のレコードを取得したいと考えています。 レコード数がかなりおおいので パフォーマンスを重視したいのですが、 検索SQLがわかりません。 select * from test_tbl where id like '%di6ek68dh5ls7g'だとでると おもうのですが、 これ以上にパフォーマンスがあがる SQLがわかる方お願いいたします。