1. ホーム
  2. sql-server

[解決済み】マルチインデックスとマルチカラムインデックスの比較

2022-03-23 04:36:01

質問

複数の列に対して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つ注意すべき点は、クラスタ化インデックスの最初のカラムはユニークキー(IDカラムを推奨)であるべきだということです。 基本的に、これはデータがインデックスの最後に挿入されるのを助け、ディスクIOやページ分割を大量に発生させないようにするためです。

次に、データに対して他のインデックスを作成する場合、それらが巧みに構築されていれば、それらは再利用されます。

例:あるテーブルを3つのカラムで検索するとします。

州、郡、郵便番号

  • をクリックすると、都道府県名だけで検索できる場合があります。
  • 州、郡で検索することもあります。
  • 州、郡、郵便番号で頻繁に検索します。

そうすると、state, county, zip.を含むインデックスが、この3つの検索で使われることになります。

zipだけで検索することが多い場合、zipはインデックスの3番目の部分であり、クエリオプティマイザはそのインデックスを有用とは見なさないため、上記のインデックスは(いずれにせよSQL Serverによって)使用されないでしょう。

そこで、この例で使用するZipだけのインデックスを作成することができます。

ちなみに 多列インデックスの場合、インデックスの最初の列は常に検索に使えるという事実を利用することができます。 また、「状態」のみで検索する場合は、効率的ですが、「状態」に対する単一列インデックスほど効率的ではありません。

よく使うクエリのwhere節やgroup byに依存するというのが、お探しの答えでしょうか。

この記事はとても役に立ちます :-)