- ベストアンサー
インデックスの作成
インデックスを複数作成する理由がわかりません。 TESTテーブルにA,B,C,Dという項目があった場合、 TEST_IDX(A,B,C,D)のように作ってしまえば、いずれの 項目にもインデックスが貼られているので、それでOK というわけにはいかないのでしょうか? 例えばインデックスを 1.TEST_IDX_1(A,B) 2.TEST_IDX_2(B,C) 3.TEST_IDX_3(D) のように作成する理由とは何でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 例えばインデックスを > 1.TEST_IDX_1(A,B) > 2.TEST_IDX_2(B,C) > 3.TEST_IDX_3(D) > のように作成する理由とは何でしょうか? (A,B,C,D)として作成されたインデックスは A が検索条件に含まれず、B,C しか条件にないときには役に立たないからです。(INDEX SKIP SCAN にはあえて触れません) これは索引の構造を考えていただければすぐに分かると思います。 例えば、'いろはに' と言う文字列を辞書の索引で探すときに、まず「い」で始まるものを探して、その中で「ろ」で始まるものを探して、さらにその中で「は」で始まるものを探して「に」で終わるものを探すでしょう。そうすると目的のページに行き着けるわけですね。 でも、'○ろは○' という文字列を文字列を辞書の索引で探すときどうしますか? 索引が全く役に立たず、結局全部のページを見て行くしかないことが分かりますよね。それは、最初の文字が分からないから、絞込みが効かないためですね。 そこで、2番目と3番目の項目だけの値を含む索引があればどうでしょう。2番目が「ろ」で3番目が「は」であるページを探すことで、ある程度ページを絞り込むことができますね。 これが > 2.TEST_IDX_2(B,C) という索引にも意味があるという理由になります。
その他の回答 (2)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
必要な全ての項目を網羅する索引を持ったとして・・ 例えば、A+B+C+Dという索引から、B,Cだけを条件に 絞り込み行う場合、索引全体を探査する必要があります。 なので、標準的なオラクルの索引処理では、A+B+C+Dの 索引を使わない方向でプランニングされます。 但し、9iシリーズから、INDEX SKIP SCANという機能で 上記のような索引であっても、索引を使った検索が可能です。 効率については、良くないのは、明白ですが.. 索引保守と検索効率の比重によっては、有用な機能だと 思います。 (全表検索より、INDEX SKIP SCANの方が良い場合であればですが・・)
お礼
ご回答に対する御礼が遅れてしまい、申し訳ございません。 ご回答をいただき、ありがとうございました。
- ymmasayan
- ベストアンサー率30% (2593/8599)
インデックスの数と検索スピードの違いでしょう。 (A,B,C,D)だと最大A×B×C×Dの数のインデックスができます。 (A,B)、(B,C)、(D)だとA×B+B×C+Dですみます。
お礼
ご回答に対する御礼が遅れてしまい、申し訳ございません。 非常に分かりやすいご回答をいただき、ありがとうございました。 検索スピードがどのように違ってくるのか、自分でも調べてみます。
お礼
ご回答に対する御礼が遅れてしまい、申し訳ございません。 非常に分かりやすいご回答をいただき、ありがとうございました。