異なる構文を使用してクエリを表現すると、非クラスター化インデックスを使用するという希望をオプティマイザーに伝えるのに役立つ場合があります。以下のフォームを使用すると、必要な計画を確認できます。
SELECT
[ID],
[DeviceID],
[IsPUp],
[IsWebUp],
[IsPingUp],
[DateEntered]
FROM [dbo].[Heartbeats]
WHERE
[ID] IN
(
-- Keys
SELECT TOP (1000)
[ID]
FROM [dbo].[Heartbeats]
WHERE
[DateEntered] >= CONVERT(datetime, '2011-08-30', 121)
AND [DateEntered] < CONVERT(datetime, '2011-08-31', 121)
);
そのプランを、非クラスター化インデックスがヒントで強制されたときに作成されたプランと比較します。
SELECT TOP (1000)
*
FROM [dbo].[Heartbeats] WITH (INDEX(CommonQueryIndex))
WHERE
[DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
プランは基本的に同じです(キールックアップはクラスター化インデックスのシークにすぎません)。両方の計画フォームは、非クラスター化インデックスで1回のシークと、クラスター化インデックスへの最大1000回のルックアップのみを実行します。
重要な違いは、トップ演算子の位置です。2つのシークの間に位置するTopは、オプティマイザーが2つのシーク操作をクラスター化インデックスの論理的に等価なスキャンに置き換えることを防ぎます。オプティマイザーは、論理プランの一部を同等のリレーショナル操作で置き換えることにより機能します。topは関係演算子ではないため、書き換えによってクラスター化インデックススキャンへの変換が妨げられます。オプティマイザーがTop演算子の位置を変更できた場合でも、コストの見積もりの仕組みにより、シーク+ルックアップよりもスキャンが優先されます。
スキャンとシークのコスト
非常に高いレベルでは、スキャンとシークのオプティマイザーのコストモデルは非常に単純です。320回のランダムシークのコストは、スキャンで1350ページを読み取るのと同じであると推定されます。これはおそらく、特定の最新のI / Oシステムのハードウェア機能とはほとんど似ていませんが、実用的なモデルとしては十分に機能します。
また、このモデルでは、すべてのクエリがデータまたはインデックスページが既にキャッシュにない状態で開始されると想定されているという主要なものとして、いくつかの単純化された仮定を行っています。含意は、すべてのI / Oが物理的なI / Oになるということです-ただし、実際にはそうなることはめったにありません。コールドキャッシュであっても、プリフェッチと先読みは、クエリプロセッサが必要とするまでに、必要なページが実際にメモリ内にある可能性が高いことを意味します。
もう1つの考慮事項は、メモリにない行に対する最初の要求により、ページ全体がディスクからフェッチされることです。同じページの行に対する後続のリクエストでは、物理I / Oは発生しません。原価計算モデルには、このような効果を考慮するためのロジックが含まれていますが、完全ではありません。
これらすべての(およびそれ以上の)ことは、オプティマイザーが通常よりも早くスキャンに切り替える傾向があることを意味します。ランダムなI / Oは、物理的な操作が行われる場合にのみ、「シーケンシャル」I / Oよりも「はるかに高価」です。メモリ内のページへのアクセスは実際に非常に高速です。物理的な読み取りが必要な場合でも、断片化のためにスキャンによってシーケンシャル読み取りがまったく行われない場合があり、パターンが本質的にシーケンシャルになるようにシークが連結される場合があります。それに加えて、最新のI / Oシステム(特にソリッドステート)のパフォーマンス特性の変化と全体が非常に不安定に見え始めます。
行の目標
計画内にトップオペレーターが存在すると、原価計算アプローチが変更されます。オプティマイザーは、スキャンを使用して1000行を検索する場合、クラスター化インデックス全体をスキャンする必要がない可能性があることを認識できるほど賢く、1000行が見つかったらすぐに停止できます。Top演算子で1000行の「行の目標」を設定し、統計情報を使用してそこから戻り、行ソース(この場合はスキャン)から必要な行数を推定します。ここでこの計算の詳細について書きました。
この回答の画像は、SQL Sentry Plan Explorerを使用して作成されました。