web-dev-qa-db-ja.com

マルチインデックスとマルチカラムインデックス

私はSQL Server 2005でテーブルにインデックスを追加したところですが、考えたことがあります。 1つのインデックスを作成することと、インデックスを作成する列ごとに1つのインデックスを作成することよりも複数の列を定義することの違いは何ですか。

一方を他方よりも使用する必要がある特定の理由はありますか?

例えば

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Versus

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)
567
GateKiller

私は Cade Roux に同意します。

この記事はあなたを正しい軌道に乗せるでしょう:

注目すべき1つのことは、クラスタード・インデックスは最初のカラムとしてユニークキー(私がお勧めするアイデンティティカラム)を持つべきです。基本的にそれはあなたのデータがインデックスの終わりに挿入するのを助けて、たくさんのディスクIOとページ分割を引き起こしません。

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

例えば3列のテーブルを検索すると想像してください。

州、郡、郵便番号。

  • 州によってのみ検索することもあります。
  • 州や郡で検索することもあります。
  • あなたは頻繁に州、郡、郵便番号で検索します。

次に州、郡、Zipのインデックス。これら3つの検索すべてで使用されます。

Zipだけで検索した場合、Zipはそのインデックスの3番目の部分であり、クエリオプティマイザはそのインデックスを参考にしてくれないため、上記のインデックスは(SQL Serverでは)使用されません。

その後、Zipだけでこのインスタンスで使用されるインデックスを作成できます。

私はあなたが探している答えはそれがあなたの頻繁に使われるクエリのあなたのwhere句とあなたのgroup byに依存するということであると思います。

この記事は大いに役立ちます。 :-)

281
evilhomer

はい。 Kimberly Trippの索引付けに関する記事 をチェックすることをお勧めします。

インデックスが「カバー」している場合は、インデックス以外のものを使用する必要はありません。 SQL Server 2005では、キーの一部ではない列をインデックスに追加して、残りの行への移動を排除することもできます。

1つの列に複数のインデックスがある場合は、1つのインデックスしか使用されない可能性があります。さまざまなインデックススキーマがもたらす効果を確認するには、実行計画を参照する必要があります。

また、チューニングウィザードを使用して、特定のクエリまたはワークロードでどのインデックスが最適に機能するかを判断することもできます。

70
Cade Roux

複数列インデックスは、 all 列を参照するクエリに使用できます。

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

これは複数列インデックスを使って直接調べることができます。一方、使用できるのは単一列インデックスのうちの1つです(Column1 = 1を持つすべてのレコードを検索し、それぞれでColumn2とColumn3を確認する必要があります)。

35
MobyDX

見逃されているように見える1つの項目は星の変換です。 インデックス交差 演算子は、ファクトテーブルに対する入出力が行われる前に、各述部がヒットした行のセットを計算して述部を解決します。スタースキーマでは、個々のディメンションキーにそれぞれインデックスを付けます。クエリオプティマイザは、インデックス交差計算によって選択する行を解決できます。個々の列のインデックスは、これに対して最高の柔軟性を与えます。

比較的静的な列のセットを頻繁に使用することになるクエリがある場合は、それらすべてを含む単一のカバーインデックスを作成すると、パフォーマンスが劇的に向上します。

インデックスに複数の列を入れることによって、オプティマイザは列がインデックスにない場合にのみテーブルに直接アクセスする必要があります。私はこれらをデータウェアハウスに多用しています。欠点は、特にデータが非常に不安定な場合は、これを行うと多くのオーバーヘッドがかかる可能性があることです。

単一列にインデックスを作成すると、OLTPシステムでよく見られる検索操作に役立ちます。

なぜカラムにインデックスを付けているのか、またどのように使用されるのかを自問してください。いくつかのクエリプランを実行し、いつアクセスされているかを確認します。インデックスチューニングは科学と同じくらい本能的です。

7
Bob Probst