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

SQL Server 2008:日時による並べ替えが遅すぎる

    id による並べ替え datetime で注文する際にクラスター化インデックス スキャンを使用する可能性があります ソートまたはインデックス ルックアップのいずれかを使用します。

    これらの方法はどちらも、クラスター化されたインデックス スキャンよりも低速です。

    テーブルが id によってクラスター化されている場合 、基本的には既にソートされていることを意味します。レコードは B+Tree に含まれています id のページをリンクするリンク リストがあります。 注文。エンジンは、リンクされたリストをトラバースして、id で並べ替えられたレコードを取得する必要があります。 .

    id の場合 s が順番に挿入されました。これは、行の物理的な順序が論理的な順序と一致し、クラスター化インデックス スキャンがさらに高速になることを意味します。

    レコードを datetime で並べたい場合 、2 つのオプションがあります:

    • テーブルからすべてのレコードを取得し、並べ替えます。遅さは明らかです。
    • datetime でインデックスを使用する .インデックスはディスクの別の領域に格納されます。これは、エンジンがネストされたループでインデックス ページとテーブル ページの間を行き来する必要があることを意味します。さらに遅いです。

    順序を改善するために、datetime に個別のカバリング インデックスを作成できます。 :

    CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
    

    、クエリで使用するすべての列をそのインデックスに含めます。

    このインデックスは、テーブルのシャドウ コピーのようなものですが、データの並べ替え順序が異なります。

    これにより、datetime による順序付けを行うキー ルックアップを取り除くことができます (インデックスにはすべてのデータが含まれているため)。 id と同じ速さ .

    更新:

    この問題に関する新しいブログ投稿:



    1. 内部結合select(A、B)on A and B vs where(A、B)in select(A、B)in mysql

    2. EntityFrameworkとMysqlで正規関数を使用する方法

    3. crosstab()クエリの結果に対するフィルタリングの予期しない影響

    4. Oracleデータベースでは、ROWNUMとROW_NUMBERの違いは何ですか?