Remusが言うように、それはワークロードに依存します。
私は受け入れられた答えの誤解を招く側面に対処したいと思います。
インデックス内のすべての列に対して等価検索を実行するクエリの場合、大きな違いはありません。
以下は2つのテーブルを作成し、それらに同じデータを入力します。唯一の違いは、1つは最も選択性の高いものから最も選択性の低いものへと順序付けられたキーを持ち、もう1つはその逆です。
CREATE TABLE Table1(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE TABLE Table2(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE NONCLUSTERED INDEX MyINDX on Table1(MostSelective,SecondMost,Least);
CREATE NONCLUSTERED INDEX MyINDX2 on Table2(Least,SecondMost,MostSelective);
INSERT INTO Table1 (MostSelective, SecondMost, Least)
output inserted.* into Table2
SELECT TOP 26 REPLICATE(CHAR(number + 65),800), number/5, '~'
FROM master..spt_values
WHERE type = 'P' AND number >= 0
ORDER BY number;
両方のテーブルに対してクエリを実行しています...
SELECT *
FROM Table1
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
SELECT *
FROM Table2
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
...どちらもインデックスファインを使用し、まったく同じコストが与えられます。
受け入れられた回答のASCIIアートは、実際にはインデックスの構造ではありません。Table1のインデックスページを以下に示します(画像をクリックしてフルサイズで開きます)。
インデックスページには、キー全体を含む行が含まれます(この場合、インデックスが一意として宣言されていないため、行識別子に追加のキー列が実際に追加されていますが、これについての詳細はここで確認できます)。
上記のクエリでは、SQL Serverは列の選択性を考慮しません。これは、ルート・ページとすることを発見するのバイナリ検索しキーが (PPP...,3,~ )
あると>=(JJJ...,1,~ )
し、< (SSS...,3,~ )
それはページをお読みください1:118
。次に、そのページのキーエントリのバイナリ検索を実行し、移動先のリーフページを見つけます。
選択性の順にインデックスを変更しても、バイナリ検索から予想されるキー比較の数や、インデックスシークを行うためにナビゲートする必要があるページの数には影響しません。せいぜい、キーの比較自体がわずかにスピードアップするかもしれません。
ただし、最も選択的なインデックスを最初に並べることは、ワークロード内の他のクエリにとっては意味があります。
たとえば、ワークロードに次の両方の形式のクエリが含まれている場合。
SELECT * ... WHERE MostSelective = 'P'
SELECT * ...WHERE Least = '~'
上記のインデックスは、どちらにも対応していません。MostSelective
シークとルックアップの価値があるプランを作成するのに十分な選択性がありますが、クエリに対するものでLeast
はありません。
ただし、このシナリオ(複合インデックスの先頭列のサブセットでのインデックスシークはカバーされていません)は、インデックスを利用できるクエリの1つのクラスにすぎません。実際にMostSelective
単独でMostSelective, SecondMost
、または組み合わせて検索することはなく、常に3つの列すべての組み合わせで検索する場合、この理論上の利点は役に立ちません。
逆に次のようなクエリ
SELECT MostSelective,
SecondMost,
Least
FROM Table2
WHERE Least = '~'
ORDER BY SecondMost,
MostSelective
一般的に規定されたものと逆の順序を持つことで助けになります-クエリをカバーするので、シークをサポートし、ブートするために望ましい順序で行を返すことができます。
だから、これはアドバイスのしばしば繰り返される作品ですが、ほとんどで、それはへの潜在的な利点についてのヒューリスティックだ他のクエリ-そしてそれは実際に見て代わるものではありません、あなたのワークロード。