論理読み取りとスキャン数


8

SQL Server 2008で大きなテーブル(8M行)に対して小さなテーブル(1,000行)を結合しています。結合は大きなテーブルで非クラスター化カバリングインデックスを使用し、結合により3つのクエリプランが生成されます。私はどちらの計画がより良いかを理解しようとしていますが、この知識を一般化して、次回SQL I / O統計を調べるときに使用するヒューリスティックをよりよく理解できるようにしたいと考えています。

プラン#1はループ結合であり、次のような大きなテーブルの統計を出力します。

Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052

プラン#2はマージ結合であり、次のような統計を出力します。

Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004

プラン#3はハッシュ結合であり、次のような統計を出力します。

Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010

カバリングインデックスはによって注文され(ID, Date)ます。クエリは、IDの約50%のデータを返し、各IDについて、最新の3か月のデータの連続したチャンクを返します。これは通常、各IDの約1/4または行です。クエリは、インデックスの合計行の約1/8を返します。言い換えると、クエリはまばらですが一貫してまばらです。

ディスクヘッドを2,500回(場合によっては1,041回)動かすのは、逐次ディスクスキャンよりもはるかにコストがかかるため、計画1はこのワークロードにとってはひどいものであると想定しています。また、#3と#2には類似した順次(したがってより効率的な)I / Oパターンがあると想定しています。

しかし、計画#1が本当に最良であるケースがあります。「最良」は、I / Oサブシステムへの影響が少なく、同時に実行されている他のクエリへの影響が少ないことを意味しますか?

それとも、実際に私が持っているディスクサブシステムの種類、インデックスの断片化など、多くの変数に依存していますか。「依存する」場合、問題に取り組むための経験則はありますか?


論理読み取りはバッファープールから直接行われ、物理読み取りはディスクから行われるため、物理読み取りの数を最小限に抑えたいのは理にかなっています


3つのクエリプランを画像として投稿できますか?
usr

回答:


10

ここにキラーな取引があります:それは1月に864 * GB *のRAM を購入するために$ 12kを要しました。サーバーのRAMを、物理的な読み取りに当たらない程度まで(もちろん、ウォームアップ後)増やすだけで、大金を手に入れることができます。

それ以外の場合、あなたが提示するこれらのデータポイントのいずれかについて白黒の意見を述べることは本当に困難です。確かに計画#1はほとんどの物理読み取りを行いましたが、すべてのテストが同様にウォームアップされたキャッシュで行われたことを確信していますか?#1が#2のキャッシュをウォームアップした可能性がありますが、すべてのケースが平地で考慮されることを確認するためのテスト方法は何ですか?それでも、$ 500を払い、RAMを2倍にした場合、それ以上問題になるでしょうか?#1は最も論理的な読み取りがありません...

しかし、#2はおそらく、高いDOP(1つのスキャンを並列にすることができる)のメリットです。十分なRAMを追加した後、#2の実時間は#1より良いですか?

これらの計画のうちいくつが並行して実行されますか?#3のハッシュに対して重要なメモリ許可を同時に要求し、RESOURCE_SEMAPHOREの競合を引き起こす数十のクエリがありますか?#2はソートを実行していて、メモリ許可も要求していますか?#1は、(少なくとも投稿された情報から)許可を必要としないため、うまく機能しますか?

本当に相対的であり、あなたが尋ねる質問は、複雑な方程式系の1つの解を見つけるようなものです...単に1つ以上の解があるかもしれません。

確かなことが1つあります。8Mの行はRAMに収まり、十分なスペースが必要です。これらの物理的な読み取りは、一部のメモリバンクで物乞いをしています。


1

この一見非常に単純なクエリの場合、オプティマイザはコストモデルに従って常に最適な計画を作成します。コストモデルはかなり正確です。したがって、私の推奨は、SQL Serverに選択を任せることです。

2番目の推奨事項:ホットキャッシュを使用して3つのバリアントすべてのクエリ期間を測定します。次に決定します。(読み取りやスキャンなどに基づいて決定しないでください。重要なのは期間です。)

一般に、最適な結合タイプ(またはインデックス)を選択するには、結合アルゴリズムの仕組みを理解する必要があります。ここに投稿するには情報が多すぎます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.