0

MY_TABLE約900万行のテーブルがあります。

このテーブルには合計 38 の列があります。私の質問に関連する列は次のとおりです。

  • RECORD_ID: ID、bigint、一意のクラスター化インデックス付き
  • RECORD_CREATED: 日時、一意でない非クラスター化インデックス付き

ここで、次の 2 つのクエリを実行します。データは一意のクラスター化インデックスを持つ列によって並べ替えられているため、最初のクエリの実行速度は当然ながら 271 倍 (!) 遅くなります。

SELECT TOP 1 
    RECORD_ID 
FROM 
    MY_TABLE 
WHERE 
    RECORD_CREATED >= '20140801' 
ORDER BY 
    RECORD_ID

SELECT TOP 1 
    RECORD_ID 
FROM 
    MY_TABLE 
WHERE 
    RECORD_CREATED >= '20140801' 
ORDER BY 
    RECORD_CREATED

実行時間は、それぞれ 1630 ミリ秒と 6 ミリ秒です。

お知らせ下さい。

PS : 環境のセキュリティ ポリシーにより、実行計画や使用が表示されませんSQL Profiler

4

1 に答える 1

2

SQL Server では、このクエリの実行方法についていくつかの選択肢があります。あなたが言及したインデックスを活用して、すべてのアイテムをソートすることから始めて、その後、WHERE句に一致しないアイテムを除外することでフォローアップすることができます。ただし、通常は、作業しているデータ セットのサイズを最初に削減する方が高速であるため、多くの項目を並べ替える必要はありません。

そのため、SQL Server はWHERE最初にフィルターを実行することを選択する可能性が最も高いです。これを行う場合、RECORD_CREATED で一意ではない非クラスター化インデックスを使用して、RECORD_CREATED が '20140801' より小さいすべてのアイテムをスキップし、その後のすべてのアイテムを取得することから始めます。

その時点で、すべての項目が RECORD_CREATED インデックスで見つかった順序で事前に並べ替えられているため、2 番目のクエリでは追加の作業は必要ありませんが、最初のクエリでは、選択されたレコードに対して並べ替えを実行する必要があります。 .

于 2014-09-10T18:31:24.430 に答える