SQLOSの実行モデル(RUNNING状態、RUNNABLEキュー、WAITERリスト)に関して、RAM現在進行中のページの論理読み取りがある場合のタスクの状態はどうなりますか?
それがWAITERリストの場合、最も一般的な待機タイプは何でしょうか?
そのような操作にかかる時間をどうにかして測定できますか?
多くの論理読み取りがクエリを遅くし、多くのテーブル/インデックススキャン(すでにバッファプールにある)がクエリを遅くすることを知っています-それらがstatistics/dmvにどのように表示されるか、または他と区別する方法を知りたいだけです「クラシック」待機タイプ。
ある種のリソースを待つ必要がある場合、ワーカーはウェイターリストに登録されます。論理読み取りを待機するリソースはありません。バッファプールがページアウトされていないと仮定すると、データはSQLServerによって管理されているメモリにすでに存在します。多くの論理読み取りを行うクエリは、それらの論理読み取りを行うために多くのCPUを消費するため、低速です。
論理読み取りを実行するときにSQLServerが実行している内部操作を把握したい場合は、論理読み取りによってボトルネックになっているクエリを実行しながら、 perfview またはその他のツールを使用してETWトレースを実行できます。ワークロードにメモリスループットの問題があると思われる場合は、ETWトレースが適切なステップになる可能性があります。これはおそらく当てはまらないことに注意してください。次のデモは、クエリのパフォーマンスの問題に取り組むための間違った方法であることはほぼ間違いありません。
最初に、ほとんどの時間を論理読み取りに費やすと予想されるクエリをまとめます。
DROP TABLE IF EXISTS #215016;
SELECT 1 ID, REPLICATE('Z', 1000) FILLER INTO #215016
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
SELECT t1.ID, t2.ID
FROM #215016 t1
INNER JOIN #215016 t2 ON t1.ID < t2.ID
OPTION (MAXDOP 1, QueryRuleOff BuildSpool);
SQL Serverは、クエリの実行中にCPUのフルコアを使用しました。 10秒のサンプルから取得したperfviewの結果は次のとおりです。
おそらく、丸で囲まれたメソッド名が関心のあるものです。このクエリでは、SQLServerはCPU時間の約5%をsqlmin!BPool::Get
に費やします。これは、実際に論理読み取りを実行することに関係していると思います。その考えを擁護するために、そのメソッドはほとんどの場合sqlmin!BUF::AcquireLatch
を呼び出すものです。
クエリ中に取得される共有ラッチの数は、論理読み取りの数とほぼ同じです。ただし、メソッド名はMicrosoftによって文書化されておらず、「論理読み取り」の全範囲がわからないため、これは単なる推測です。