MS SQL Server (バージョン 2005 を使用) で列または複数の列にインデックスを作成する場合、各列のインデックスを昇順または降順のいずれかに指定できます。なぜこの選択肢がここにあるのか理解できません。バイナリ ソート手法を使用すると、どちらの方法でも検索は同じくらい高速になるのではないでしょうか。どの順序を選択しても、どのような違いがあるのでしょうか。
ベストアンサー1
これは主に複合インデックスを使用する場合に重要になります。
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
次のいずれかに使用できます。
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
または:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
ただし、以下の場合は除きます:
SELECT *
FROM mytable
ORDER BY
col1, col2
単一列のインデックスは、両方の方法での並べ替えに効率的に使用できます。
詳細については私のブログの記事をご覧ください:
アップデート:
実際、これは単一列のインデックスでも重要になる可能性がありますが、それほど明白ではありません。
クラスター化されたテーブルの列のインデックスを想像してください。
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
のインデックスは、行への参照とともにcol1
の順序付けられた値を保持します。col1
テーブルはクラスター化されているため、行への参照は実際には の値ですpk
。また、 の各値内で順序付けられますcol1
。
これは、インデックスのリーフが実際には に基づいて順序付けられていることを意味し(col1, pk)
、次のクエリでは、
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
並べ替えの必要はありません。
次のようにインデックスを作成します。
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
の場合、 の値は降順でソートされますが、の各値内のcol1
の値は昇順でソートされます。pk
col1
これは、次のクエリを意味します。
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
は によって提供できますix_mytable_col1_desc
が、 によって提供することはできませんix_mytable_col1
。
つまり、CLUSTERED INDEX
任意のテーブル上の を構成する列は、常にそのテーブル上の他のインデックスの末尾の列になります。