SQL Serverでtpchデータベースを作成した後、以下のクエリを試しました。
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
テーブルのlineitemには、l_partkeyに非クラスター化インデックスがあります。上記のクエリを数回発行したところ、論理読み取りが毎回異なることがわかりました。
Table 'lineitem'. Scan count 1, logical reads 1019, physical reads 4, read-ahead reads 1760, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1007, physical reads 4, read-ahead reads 1720, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1030, physical reads 4, read-ahead reads 1792, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
ここの投稿から:論理的な読み取りカウントは異なります。先読みの動作が原因である可能性があります。
しかし、正確に先読みがより論理的な読み取りを引き起こす理由は何ですか?SQL Serverの動作をどのように変更しますか?SQL Serverのように、とにかくキャッシュにあるため、より多くのインデックスページを読み取ることができますか?
とにかく、先読みを無効にして上記のクエリを再度発行しました。現在は、毎回同じ量の論理読み取りが報告されます。しかし、論理読み取りははるかに小さいです!!
Table 'lineitem'. Scan count 1, logical reads 404, physical reads 160, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
だから私の質問は、先読み機能がなぜさらに多くのさまざまな論理読み取りカウントを引き起こす可能性があるのですか?
好奇心から、 "order by"なしで別のクエリを試しました。
select top 100 * from dbo.lineitem
先読みなしの結果は次のとおりです。
Table 'lineitem'. Scan count 1, logical reads 5, physical reads 3, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
これが先読みの結果です。
Table 'lineitem'. Scan count 1, logical reads 15, physical reads 2, read-ahead reads 3416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
先読みがあるものは、まだより論理的な読み取りがあります。なぜ?