人生最悪の忘れ物

インデックスを複数作成する理由がわかりません。

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)
のように作成する理由とは何でしょうか?

A 回答 (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)

という索引にも意味があるという理由になります。
    • good
    • 0
この回答へのお礼

ご回答に対する御礼が遅れてしまい、申し訳ございません。

非常に分かりやすいご回答をいただき、ありがとうございました。

お礼日時:2005/11/14 15:51

必要な全ての項目を網羅する索引を持ったとして・・


例えば、A+B+C+Dという索引から、B,Cだけを条件に
絞り込み行う場合、索引全体を探査する必要があります。
なので、標準的なオラクルの索引処理では、A+B+C+Dの
索引を使わない方向でプランニングされます。

但し、9iシリーズから、INDEX SKIP SCANという機能で
上記のような索引であっても、索引を使った検索が可能です。

効率については、良くないのは、明白ですが..
索引保守と検索効率の比重によっては、有用な機能だと
思います。
(全表検索より、INDEX SKIP SCANの方が良い場合であればですが・・)
    • good
    • 0
この回答へのお礼

ご回答に対する御礼が遅れてしまい、申し訳ございません。

ご回答をいただき、ありがとうございました。

お礼日時:2005/11/14 15:57

インデックスの数と検索スピードの違いでしょう。



(A,B,C,D)だと最大A×B×C×Dの数のインデックスができます。
(A,B)、(B,C)、(D)だとA×B+B×C+Dですみます。
    • good
    • 0
この回答へのお礼

ご回答に対する御礼が遅れてしまい、申し訳ございません。

非常に分かりやすいご回答をいただき、ありがとうございました。
検索スピードがどのように違ってくるのか、自分でも調べてみます。

お礼日時:2005/11/14 15:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


おすすめ情報