これは主に、複合インデックスで使用する場合に重要です。
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
を構成する列 どのテーブルでも、常にそのテーブルの他のインデックスの末尾の列になります。