- 締切済み
Oracleのindex作成のポイントに付いての質問。
こんにちは。 Oracleのindex作成のポイントに付いて質問させて頂きます。 テーブルAに対して、インデックスAと言う名称のINDEXを作成するとします。 テーブルAの項目はP1,A1,A2,A3,A4と言う5ケの項目より成り立ちます。 (P1はテーブル作成時のプライマリーキーです。) 今、プログラム1・プログラム2・プログラム3からテーブルAのデータを利用していますが、速度が遅くそのためインデックスAを作成して改善するところです。 プログラム1では、A1,A2,A3をキーとしてデータを読み込んでいます。プログラム2ではA1とA4、プログラム3ではA1をキーとして読みこんでいます。 優先順位は、プログラム1が第1優先、プログラム2が第2優先、プログラム3が第3優先です。 システムに負荷を掛けたくないと言う理由からインデックスは1ケのみ作成するとします。 キー項目としては、どれを選定するべきでしょうか? 1)A1 2)A1,A2,A3 3)A1,A2,A3,A4 1)は汎用性があるように思えますが? 2)でプログラム1を優先させて、同時にプログラム2・3にもこのINDEXは適用されるのでしょうか? それとも、全てを網羅した3)を使うべき? ご経験者の方宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
>インデックスを張るとそれぞれ早くなるような感じがしてどうも感覚的にしっくり来てない状態ですが・・・。 だから、実行計画を取得してください。SQL*PLUSで、SET AUTOTRACE ON。または、サンプルの件数が十分(最低でも千件)にあるなら、SET TIMING ONで、実行にかかった時間が表示されます。どちらもSQL*PLUSで使えます。 インデックスの使用方法については、Oracle9iR2のマニュアルを見ているので、他のバージョンでは違う可能性があります。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>1)でも早くなるような感じで、どうもしっくり来てない>ですが、色々とやっています・・・。 件数少ないんじゃないんですか? A1の条件だけで、かなり絞り込まれてるとか。
お礼
有難う御座います。 試行錯誤中です。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
A1,A2,A3 A1,A4 の2つを張れば、3つの処理すべてまかなえます。 あとは、どの処理を優先させるかでしょう。 ちなみに、 A1,A2,A3,A4 は、どの処理でも使用されません。
お礼
早速のご回答有難う御座います。 select * from テーブルA WHERE A1=定数 AND A2=定数 AND ・・・・ と言ったSQL文でインデックス変えながらテストしてます。 1)でも早くなるような感じで、どうもしっくり来てないですが、色々とやっています・・・。
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
とりあえず3つとも作ってみては? 1を作る→各プログラムから実行されるSQLを擬似的に実行し、実行計画をとる→1を削除する→2を作る→(以下略) でも、3のインデックスでも、プログラム2はインデックスを使いません。A1, A2, A3, A4の順で列を指定してインデックスを作ると、"A1", "A1&A2", "A1&A2&A3", "A1&A2&A3&A4"の条件を指定したとき、インデックスを使用します。 ということは、2で作ると、プログラム1とプログラム3はインデックスを使ってくれるわけですね。 なお、NULLを検索しようとすると、インデックスは使えません。
お礼
早速の回答有難う御座います。 おっしゃる通り只今全てのパターンを試しています。 インデックスを張るとそれぞれ早くなるような感じがしてどうも感覚的にしっくり来てない状態ですが・・・。
インデックスに限らず、データベース設計はソフトウェアの使用目的やデータの性格 ( レコード件数や各項目のカーディナリティなど ) によって左右されますので、提示されている抽象的な情報だけでは最適解は判断できません。
お礼
早速のご回答ありがとう御座います。
お礼
有難う御座います。 マニュアル見ながら試行錯誤中です。
補足
見えました。 実行計画で 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 INDEX (RANGE SCAN) OF 'インデックスA' と 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'テーブルA' 2 1 INDEX (RANGE SCAN) OF 'インデックスA' の違いでした。