2016-06-28 10 views
2

私はこれを何度も見つけましたが、同じことについては正確な説明がありませんでした。複合プライマリキーのインデックス

静的テーブルを除く1つの列に主キーがほとんどない複雑なデータベース構造(Oracle 10g)で作業しています。

私の質問は複合主キーID(LXI, VCODE, IVID, GHID)と考えられます。これは主キーなので、Oracleはデフォルトの索引を提供します。

プライマリキー自体またはそのサブカラムの単一インデックスを1つ(システム生成)取得できますか?

私は個々の列に基づいてデータ(何百万ものレコード)を検索しているので、これを頼んでください。システムが個々の列のインデックスも生成するようになりました。私のクエリが、個々の列のインデックスを明示的に定義するときに実際に実行される方法よりもかなり速く実行される理由

それは、個々の列のインデックスを生成しません満足のいく答えを事前

+0

オラクル10に用意されていたのですか?どのインデックスが作成されたかを確認するだけです... – sstan

+0

これは良い質問です。 2つの異なるインデックス構造を使用してクエリのパフォーマンスデータを示した方が良いでしょう。 –

答えて

3

主キーは非NULL固有の鍵であるとそれを組み合わせるために持っている第二のインデックスを使用するインデックスを使用します。あなたのケースでは、ユニークなインデックスは、宣言の順に4つのカラム、LXI, VCODE, IVID GHIDを持っています。

VCODEに条件があり、LXIにない場合、ほとんどのデータベースはインデックスを使用しません。 Oracleには、このような状況を可能にする「スキップ・スキャン」と呼ばれる特別なタイプの索引スキャンがあります。それはdocumentationに記載されています。

インデックススキップスキャンは、個々の列のインデックス範囲スキャンより少し遅くなることが予想されます。しかし、これは、where節の複雑さにもよります。たとえば、VCODEIVIDおよびGHIDに接続されたANDの3つの同等条件は、スキップスキャンの優れた例です。そして、そのようなインデックスはWHERE節をカバーするでしょう - 効率性が高く、1列のインデックスより優れています。注意点としては

:インデックススキップスキャンは、Oracle 9iので導入されたので、彼らは、私はこの質問への答えはノー、あなた自身のために検証することは困難ではないと思い

+0

すばらしい!説明とドキュメントをありがとう。 :) –

0

感謝をお願いします。複合インデックス を生成します。最初にLXI のインデックスを作成し、次の列はツリー構造になります。あなたは主キーの第一欄に検索した場合 は、それはあなたが最初の列

ex : select where ...LXI=? will use index PK 
    select where LXI=? and VCODE=? alse use pk 
    but select where VCODE=? will not use it (without LXI) 
+1

ほとんどの場合、真ですが、オラクルは最後のユースケースでもスキップ索引スキャンを実行できます。 – sstan

+0

@sstanは合意しましたが。索引スキップ・スキャンでは、複合索引の論理サブ索引を使用します。データベースは、単一の索引で別々の索引を検索しているかのように「スキップする」スキップ・スキャンは、複合索引の先頭の列にはほとんど値がなく、インデックスの非リーディングキーの別個の値。 –

+0

LXIに大きな値の異なる値が設定されている場合は@sstan。 –

関連する問題