sql >> データベース >  >> RDS >> Sqlserver

SQL Serverインデックス-昇順または降順、どのような違いがありますか?

    これは主に、複合インデックスで使用する場合に重要です。

    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を構成する列 どのテーブルでも、常にそのテーブルの他のインデックスの末尾の列になります。



    1. OracleSQL-順次値の範囲を特定する

    2. MySQLで1日あたりの新規ユーザーを獲得する方法

    3. 前月または前年度の欠落データを累積的に追加する

    4. sqliteに記録するデータを挿入しています