1. ホーム
  2. sql

[解決済み] SQL Server インデックス - 昇順か降順か、その違いは?

2022-05-30 18:44:55

質問

MS SQL Server (バージョン 2005 を使用) で、ある列または複数の列にインデックスを作成するとき、各列のインデックスを昇順または降順に指定することができます。なぜこのような選択があるのか、理解に苦しみます。バイナリソートの技術を使えば、ルックアップはどちらでも同じように高速になるのではないでしょうか? どちらの順序を選択しても、違いはないのでしょうか?

どのように解決するのですか?

これは主に複合インデックスで使用する場合に問題となります。

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

1つのカラムに対するインデックスは、両方の方法でソートするために効率的に使用することができます。

詳しくは私のブログの記事をご覧ください。

更新しました。

実は、これはそれほど明白ではありませんが、単一列のインデックスでも問題になることがあります。

クラスタ化されたテーブルの列に対するインデックスを想像してください。

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 を構成するカラムは、常にそのテーブルの他のインデックスの末尾のカラムとなります。