在我的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.
预读的仍然具有更多的逻辑读物。所以为什么?