SQL Server のインデックス - 昇順と降順の違いは何ですか? 質問する

SQL Server のインデックス - 昇順と降順の違いは何ですか? 質問する

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の値は昇順でソートされます。pkcol1

これは、次のクエリを意味します。

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk DESC

は によって提供できますix_mytable_col1_descが、 によって提供することはできませんix_mytable_col1

つまり、CLUSTERED INDEX任意のテーブル上の を構成する列は、常にそのテーブル上の他のインデックスの末尾の列になります。

おすすめ記事