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

为什么?

4

2 回答 2

2

注意“物理读取”的区别

简单地,

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

清除缓存会强制进行物理读取,因此您可以进行逻辑读取。您不能有零逻辑读取(对于学究,除非逻辑读取意味着行但此处超出范围

于 2013-04-24T14:39:20.750 回答
-1

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

于 2013-04-24T14:39:31.817 回答