0

2 つのクエリで「推定実行計画の表示」を使用した後、次のように 2 つのインデックスを作成しました。

CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table
(colA,colB,colC)

CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table
(colA,colD,colE)

インデックスを 1 つだけ作成する (上記の 2 つを置き換える) ことに気付きました。

CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table
(colA,colB,colC,colD,colE)

クエリも最適化します。

だから私の質問は、すべての列を持つインデックスが2つの別々の列と同様に最適化されるのは正しいですか、それとも1つの方法が他の方法よりも好ましいということです。

ありがとう

4

3 に答える 3

2

あなたの質問に答えて、2つの最適化は同等ではありません。

ある方法が別の方法よりも優先されるかどうかについては、クエリが何であるか、およびデータをどのように変更するかによって異なります。

where(ColA、ColB、ColC)に特定の句があり、(ColA、ColD、ColE)に別の句があるクエリがある場合、2つのインデックスはそのシナリオに適しています。

ただし、テーブルを頻繁に更新する場合は、2つのインデックスを維持するための追加のオーバーヘッドが発生します。

このようなものと同様に、パフォーマンス分析を実施し、予想されるアクセスのパターンに基づいてメトリックを取得するのが最善です。

于 2012-09-24T13:58:37.233 に答える
2

すべての列を含むインデックスが 2 つの別々の列と同様に最適化されるのは正しいですか

いいえ、絶対に違います。クエリに のインデックスが必要だった可能性が高い(colA) INCLUDE (colB, colC, colD, colE)か、colA実際にはクラスター化されたキーの候補として適している可能性があります。これはあなたが提示した一般的なケースであり、実際の結論を引き出すことはできません。ただし、原則として、異なる列のインデックスは異なる役割を果たし、異なるクエリで使用できます。のインデックスは、 、または(A, B, C)のインデックスの必要性を置き換えることはできません。列の順序が異なっていても置換できません。上のインデックスは異なり、上のインデックスから置換することはできません。(B, C)(B, D)(C, E)(A, B, C)(B, C, A)

何よりもまず、インデックスの設計のトピックに目を通すことをお勧めします。読み終わったら、どんどん質問してください。

于 2012-09-24T13:57:41.473 に答える
1

質問に簡単に答えると、順序が重要です (複数レベルのツリーを考えてください)。そのため、ColA、ColD、および ColE のみを検索し、ColB と ColC を検索しないクエリでは、結合されたインデックスは役に立ちません。

たとえば、次のようなクエリがあるとします。 SELECT colA, colD, colE FROM dbo.my_table WHERE colA = 1 AND colD = 2

2 番目の (結合された) インデックスは ('ColA' 述語を使用して) いくらか役立ちますが、データベースは colD = 2 の残りの結果をスキャンする必要があります。

一方、結合されたインデックスは全体的なスペースを占有せず、列 A への更新への影響も少ないため、トレードオフを比較検討する必要があります。

于 2012-09-24T13:56:40.820 に答える