11

次の 2 つのインデックスに違いはありますか?

  • IDX_IndexTables_1
  • IDX_IndexTables_2

ある場合、違いは何ですか?

create table IndexTables (
    id int identity(1, 1) primary key,
    val1 nvarchar(100),
    val2 nvarchar(100),
)

create index IDX_IndexTables_1 on IndexTables (val1, val2)
GO

create index IDX_IndexTables_2 on IndexTables (val2, val1)
GO
4

5 に答える 5

16

はい。違いがあります。

複合インデックスは、列が where 句で使用IDX_IndexTables_1される任意のクエリに使用できます。val1

複合インデックスは、列が where 句で使用IDX_IndexTables_2される任意のクエリに使用できます。val2

したがって、たとえばIDX_IndexTables_2、このクエリには使用できません (ただし、IDX_IndexTables_1 は使用できます)。

SELECT val1, val2 FROM IndexTables
WHERE val1 = some_value

ただし、次のクエリに使用できます。

SELECT val1, val2 FROM IndexTables
WHERE val2 = some_value AND val1 = some_other-value

複合インデックスについて考える方法は、紙の電話帳について考えることです。姓の列、次に名の列によって索引付けされます。姓で検索できますが、名だけで検索することはできません。

于 2009-10-11T04:38:40.250 に答える
4

複数列インデックスは、概念的には、すべての列フィールドを取得してそれらを連結し、結果を 1 つのフィールドとしてインデックス化することと同じです。

インデックスは B ツリーであるため、常に左から右に検索されます。インデックスがその仕事をして有用な結果を提供するために右に移動するにつれて、左から検索を開始して結果をペアにする必要があります。

インデックスが作成されたフィールドが 1 つだけの場合:

WHERE val1 LIKE 'myvalue%' (uses index)
WHERE val1 LIKE '%myvalue' (cannot use index)

複数列インデックスにも同じ概念が適用されます。

orderがval1,val2の場合

WHERE val1='value1' (uses index)
WHERE val2='value2' (cannot use index)

orderがval2,val1の場合

WHERE val1='value1' (cannot use index)
WHERE val2='value2' (uses index)

両方のフィールドが正確に一致する場合、インデックスの順序は問題になりません。

WHERE val1='value1' AND val2='value2' (uses index in any order)
于 2009-10-11T04:49:57.263 に答える
2

前の回答では、各インデックスの最初の列を使用する方法について説明しています。(where 句内)。

2 番目の列を含むクエリのパフォーマンスが向上する可能性があるため、2 番目の列が役立つことを指摘することも重要だと思います。

次のクエリは、IDX_1 のインデックス シークのみで完了し、貴重なルックアップをベース テーブルに保存します (val2 は既にインデックスの一部であるため)。

SELECT val2 from IndexTables where val1 = @someVal1

同様に、逆インデックスはこのクエリを最適化します。

SELECT val1 from IndexTables where val2 = @someVal2

ただし、次のクエリを最適化するために必要なのは、2 つのインデックスのうちの 1 つだけです (どちらでもかまいません)。

SELECT val1, val2 from IndexTables where val1 = @someVal1 and val2 = @someVal2

これは、テーブルが受け取るクエリによっては、両方のインデックスを持つ正当な理由がある可能性があることを示しています。

于 2009-10-11T06:13:53.630 に答える
2

あなたが持っているのは複合インデックスです。WHERE 句が複合インデックス内のすべての列を使用していない場合、順序は重要です。

次のクエリを検討してください。

SELECT val1
FROM IndexTables
WHERE val1 = 'MyValue'

どのインデックスが考慮されるかを知るために、複合インデックスの列を左から右に読んでください。クエリのすべての列を読み取る前にクエリに列が存在しない場合、インデックスは使用されません。

IDX_IndexTables_1(val1, val2): 左から右への読み取り val1 が存在し、それが唯一の列であるため、このインデックスが考慮されます

IDX_IndexTables_2(val2, val1): 左から右への読み取り val2 はこのクエリには存在しないため、使用されません。

于 2009-10-11T04:47:30.013 に答える
1

他の人々は彼らは違うと答えました、そして私は同意します.

他にも感想を書きますが…

  • (col1, col2) インデックスは、col1 だけにインデックスが必要ないことを意味します
  • (col2, col1) インデックスは、col2 だけにインデックスが必要ないことを意味します
  • これがカバーされている場合は順序が重要です(たとえば、col1のWHERE、SELECT col2)
  • 方向 (ASC/DESC) も重要です (その他の質問 1その他の質問 2 )
于 2009-10-11T07:31:31.557 に答える