6

複数のインデックスを持つテーブルがあり、そのうちのいくつかは同じ列を複製しています:

Index 1 columns: X, B, C, D
Index 2 columns: Y, B, C, D
Index 3 columns: Z, B, C, D

私は実際のインデックス作成についてあまり詳しくないので、X、Y、および Z がこれらの同じ列とペアになっている理由を誰かが説明できるかどうか疑問に思っています。B は発効日です。C は、特定の発効日 B のこのテーブルの準一意キー ID です。D は、識別子 C のこのレコードの優先度を識別するシーケンスです。

X、Y、Z、B、C、D ごとに 1 つずつ、合計 6 つのインデックスを作成しないのはなぜでしょうか。

別の列 T にインデックスを追加したいのですが、一部のコンテキストでは T のみをクエリし、他のコンテキストでは B、C、および D 列も指定します...したがって、次のようなインデックスを 1 つだけ作成する必要があります。または、T 用に 1 つ、(T、B、C、D) 用に 1 つ作成する必要がありますか?

インデックス作成の包括的なカバレッジをグーグルで調べたとき、期待したほどの幸運はありませんでした。B ツリー インデックス作成の詳細な説明と多くの例を入手できるリソースはありますか?

4

5 に答える 5

7

インデックス作成のルールは、インデックスを使用して、そのインデックスに使用される列のプレフィックスを構成する列のリストをフィルター処理できることです。

つまり、X と B、または X、B と C、または X のみ、または 4 つすべてでフィルタリングする場合に、インデックス 1 を使用できます。

ただし、インデックスを使用して「中間」をフィルタリングすることはできません。これは、インデックスが、行ごとにこれらの列の値を連結し、結果を並べ替えるのとまったく同じようには機能しないためです。探しているものが何から始まるかがわかっていれば、バイナリ検索を行うときと同じように、インデックスのどこを見ればよいかがわかります。

B、C、D、および X、Y、Z のいずれかでフィルタリングする必要がある場合は、3 つのインデックスが必要です。X, Y は、探している値のプレフィックス (X) が不明なため、Y でフィルター処理するだけのインデックスとしては適切ではありません。

ダニエルが述べたように、カバリング インデックスは、B、C、および D を繰り返すための可能な説明です。D がフィルター処理されていない場合でも、インデックスに表示される列が正確に必要な場合があり、それから、インデックスを使用して行を見つけるのではなく、インデックスから列を読み取るだけです。

于 2010-03-25T15:11:11.940 に答える
4

これらのインデックスにB、C、およびDが含まれる理由の1つは、頻繁に使用されるクエリのカバーインデックスがあるためです。インデックス自体に特定のクエリに必要なすべてのデータフィールドが含まれている場合は、カバーインデックスが作成されます。

データの取得にはデータページではなくインデックスページのみが使用されるため、カバーインデックスを使用するとデータの取得を大幅に高速化できます。

index 1以下は、カバーするインデックスとなるクエリの例です。

SELECT B, C, D FROM table WHERE X = '10'
于 2010-03-25T15:06:37.363 に答える
1

(T、B、C、D) で作成する必要があります。

テーブルに A と B のインデックスを持つ 2 つのフィールドがあるとします。各列に個別のインデックスを作成し、次のようなクエリを実行するとします。

SELECT * FROM table WHERE A = 10 AND B = 20

次のいずれかが発生します。

1) DB は 2 つの中間結果セットを作成します。1 つは A = 10 の行を含み、もう 1 つは B = 20 の行を含みます。次に、これら 2 つの結果セットを 1 つにマージする必要があります (重複する行もチェックします)。

2) DB は、A = 10 の行で 1 つの結果セットを作成します。次に、この中間結果セットのすべての行を手動で調べ、B = 10 の各行をチェックインする必要があります。

ただし、インデックス B がインデックス A に依存し、クエリが B の前に A を使用することがわかっている場合は、両方の列に対して 1 つのインデックスを作成できます: (A, B)

つまり、DB は最初に A = 10 のすべての行を検索しますが、B は同じインデックスの一部であるため、同じインデックス情報を使用して、B も 20 である行に結果セットをフィルター処理できます。 2 つの中間結果セットを作成してそれらをマージする必要はありません。または、インデックスの 1 つだけを使用して、もう 1 つを手動でスキャンする必要はありません。

DB がこれらの状況に対処する他の方法もあるかもしれませんが、それは主に実装に依存します。

于 2010-03-25T15:13:34.713 に答える
1

(X、B、C、D) 形式のインデックスを使用して、次のようなクエリを最適化できます。

... WHERE X rel sthg (possibly ORDER BY B, C, D)
... WHERE X = sthg AND B rel sthg (possibly ORDER BY C, D)
... WHERE X = sthf AND B = sthg AND C rel sthg (possibly ORDER BY D)

など。ここでrel、任意の関係演算子 (<、>、=、<=、>=) と sthg は値または式です。特に 2 番目の 2 つと、並べ替えバリアントは、「単一列インデックス バリアント」によって最適化されません。

OTOH、クエリを最適化できません

... WHERE B = sthg

インデックスの途中から始まるためです。ここでは、単一列のインデックスが機能します。

于 2010-03-25T15:15:51.883 に答える
0

Oracle のインデックス (およびその他の Oracle 関連の問題) に関する完全な説明と多くの例を入手できるリソースについては、askTomにアクセスしてブックマークしてください。

于 2010-03-27T18:30:08.357 に答える