我试图了解sql server(2014)中IO STATISTICS的输出并使用AdventureWorks作为数据库。
这是代码
DBCC FREESYSTEMCACHE('ALL')
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
DBCC FLUSHPROCINDB(7)
CHECKPOINT
DBCC DROPCLEANBUFFERS
SET STATISTICS TIME ON
SET STATISTICS IO ON
SELECT * FROM [HumanResources].[Employee]
SET STATISTICS TIME OFF
SET STATISTICS IO OFF
输出是
SQL Server执行时间:CPU时间= 0 ms,已用时间= 0 ms。
(290行受影响)表'员工'。扫描计数1,逻辑读取9,物理读取1,预读读取7,lob逻辑读取0,lob物理读取0,lob预读读取0。
SQL Server执行时间:CPU时间= 15毫秒,已用时间= 105毫秒。
即使在清理了所有缓存和缓冲区之后,为什么逻辑读取不是0,物理读取是10(1已经提到+ 9页逻辑读取)?我对逻辑读取的理解是从数据高速缓存读取的页数(换句话说是sql server中表的数据高速缓存)。
所有页面读取都从缓冲池中的页面读取,并且是逻辑读取。
单个物理读取意味着查询只需等待从磁盘读入单个页面到缓冲池。
其余部分由read ahead mechanism读入,并且在查询需要时已经在缓存中。
这仍然留下单页差异,因为7加1是8而不是9.可能这里的机制https://blogs.msdn.microsoft.com/ialonso/2011/12/09/the-read-ahead-that-doesnt-count-as-read-ahead/