756

複数の列に 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)
4

5 に答える 5

370

私はCade Rouxに同意します。

この記事は正しい軌道に乗るはずです:

注意すべきことの 1 つは、クラスター化されたインデックスは、最初の列として一意のキー (私が推奨する ID 列) を持つ必要があることです。基本的に、インデックスの最後にデータを挿入するのに役立ち、多くのディスク IO やページ分割が発生することはありません。

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

たとえば、3 つの列でテーブルを検索するとします。

州、郡、郵便番号。

  • 州だけで検索することもあります。
  • 州や郡で検索することもあります。
  • 州、郡、郵便番号で頻繁に検索します。

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

zip だけで非常に頻繁に検索する場合、zip はそのインデックスの 3 番目の部分であり、クエリ オプティマイザはそのインデックスを有用とは見なさないため、上記のインデックスは (とにかく SQL Server によって) 使用されません。

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

ところで、マルチカラム インデックスでは、最初のインデックス カラムは常に検索に使用でき、「状態」のみで検索する場合は効率的ですが、「状態」の単一カラム インデックスほど効率的ではないという事実を利用できます。 '

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

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

于 2008-10-07T16:10:57.883 に答える
86

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

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

複数のインデックスが 1 つの列にあり、それぞれが 1 つのインデックスしか使用されないことを意味する場合があります。実行プランを参照して、さまざまなインデックス スキームが提供する効果を確認する必要があります。

チューニング ウィザードを使用して、特定のクエリまたはワークロードのパフォーマンスを最適化するインデックスを決定することもできます。

于 2008-10-07T15:41:55.880 に答える
51

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

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

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

于 2008-10-07T15:46:51.520 に答える
17

見逃されたと思われる1つのアイテムは、星の変換です. インデックス交差演算子は、ファクト テーブルで I/O が実行される前に、各述語によってヒットする行のセットを計算することによって、述語を解決します。スター スキーマでは、個々のディメンション キーにそれぞれインデックスを付けると、クエリ オプティマイザーは、インデックスの交差計算によって選択する行を解決できます。個々の列のインデックスは、これに最適な柔軟性を提供します。

于 2008-10-07T19:19:31.153 に答える
12

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

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

単一列にインデックスを作成すると、OLTPシステムで頻繁に見られるルックアップ操作に役立ちます。

列にインデックスを付ける理由と、それらがどのように使用されるかを自問する必要があります。いくつかのクエリプランを実行し、それらがいつアクセスされているかを確認します。インデックスの調整は、科学と同じくらい本能的です。

于 2008-10-07T15:46:19.897 に答える