在sql server中清除数据缓存时,逻辑读取给出3?

时间:2013-04-24 14:31:24

标签: sql sql-server performance sql-server-2008

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 清除数据缓存时

为什么?

2 个答案:

答案 0 :(得分:2)

注意“物理读取”差异

简单地说,

  • 物理读取=数据到缓存
  • 逻辑读取=访问缓存中的数据

清除缓存会强制进行物理读取,以便您可以进行逻辑读取。你不能没有逻辑读数(对于学生来说,except where a logical read means rows but that is out of scope here

答案 1 :(得分:-1)

逻辑读取并不意味着在查询开始之前页面位于缓存中。 SQL Server必须访问的每个页面都被视为逻辑读取。如果页面必须被访问两次,则计算两个逻辑读取。每次必须访问页面时,SQL Server必须执行代码以防止在读取页面时对该页面进行更改(它使用的是锁存器)。因此,逻辑读取是一项相当昂贵的操作。因此,逻辑读取的数量是查询有多昂贵的一个很好的指标。