複数の列にわたって 1 つのインデックスを作成することと、列ごとに1 つずつ複数のインデックスを作成することの違いは何ですか?
どちらか一方を他方よりも使用すべき理由はありますか?
例えば:
Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)
対:
Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)
Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)
Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)
ベストアンサー1
同意するケイド・ルー。
この記事を読めば、正しい方向に進むことができるはずです。
注目すべき点の 1 つは、クラスター化インデックスの最初の列に一意のキー (ID 列をお勧めします) を設定する必要があることです。基本的に、これにより、インデックスの末尾にデータが挿入され、大量のディスク IO やページ分割が発生しなくなります。
第二に、データに他のインデックスを作成し、それが巧妙に構築されている場合、それらは再利用されます。
例えば、3つの列でテーブルを検索するとします
州、郡、郵便番号。
- 州のみで検索することもあります。
- 州や郡で検索することもあります。
- 州、郡、郵便番号で検索することが多いです。
次に、州、郡、郵便番号を含むインデックスが、これら 3 つの検索すべてで使用されます。
zip のみで頻繁に検索する場合、zip はそのインデックスの 3 番目の部分であり、クエリ オプティマイザーはそのインデックスを役立つものとして認識しないため、上記のインデックスは使用されません (少なくとも SQL Server では)。
次に、このインスタンスで使用される Zip のみのインデックスを作成できます。
ところでマルチカラムインデックスでは、最初のインデックス列が常に検索に使用できるという事実を活用できます。「状態」のみで検索すると効率的ですが、「状態」の単一列インデックスほど効率的ではありません。
あなたが探している答えは、頻繁に使用するクエリの where 句と group by 句によって異なるということだと思います。
この記事は非常に役立つと思います。:-)