dbcc FREEPROCCACHE
dbcc DROPCLEANBUFFERS
set STATISTICS IO ON--Case 1
SELECT * from Production.Suppliers s
--(30 row(s) affected)
--Table 'Suppliers'. Scan count 1, logical reads 3, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--again without clearing the cache I ran above
set STATISTICS IO ON
SELECT * from Production.Suppliers s
--(30 row(s) affected)
--Table 'Suppliers'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
我不明白当我清除缓存的情况1时它如何显示逻辑读取3,我读到的是逻辑读取意味着没有。页面 从数据缓存中读取但是在执行sql语句之前我在CASE 1中清除它仍然给我逻辑读取3 清除数据缓存时
为什么?
答案 0 :(得分:2)
注意“物理读取”差异
简单地说,
清除缓存会强制进行物理读取,以便您可以进行逻辑读取。你不能没有逻辑读数(对于学生来说,except where a logical read means rows but that is out of scope here)
答案 1 :(得分:-1)
逻辑读取并不意味着在查询开始之前页面位于缓存中。 SQL Server必须访问的每个页面都被视为逻辑读取。如果页面必须被访问两次,则计算两个逻辑读取。每次必须访问页面时,SQL Server必须执行代码以防止在读取页面时对该页面进行更改(它使用的是锁存器)。因此,逻辑读取是一项相当昂贵的操作。因此,逻辑读取的数量是查询有多昂贵的一个很好的指标。