重新启动SQL Server计算机后,我第一次在AdventureWorks2014数据库上运行以下查询。
SET STATISTICS IO ON
SELECT c.CustomerID
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh ON od.SalesOrderID = oh.SalesOrderID
JOIN Sales.Customer c ON oh.CustomerID = c.CustomerID
SET STATISTICS IO OFF
据我了解,逻辑读取将意味着“缓存命中”,这意味着数据是从SQL Server缓存而不是磁盘中读取的。
表“ SalesOrderDetail”。扫描计数1,逻辑读276,物理读1,预读274,lob逻辑读0,lob物理读0,lob预读0。
如果重新启动计算机,怎么可能在SQL Server缓存中包含任何条目,同时要记住该服务器上有多个数据库,因此我们看到逻辑读取为276?
答案 0 :(得分:2)
SQL Server数据库引擎实例的I / O包括逻辑和物理读取。 每次数据库引擎从缓冲区高速缓存请求页面时,都会发生逻辑读取。如果该页面当前不在缓冲区缓存中,则物理读取首先将页面从磁盘复制到缓存中。
预读
数据库引擎支持一种称为预读的性能优化机制。预读可以预测执行查询执行计划所需的数据和索引页,并在查询实际使用它们之前将这些页带入缓冲区缓存。这可以使计算和I / O重叠,从而充分利用CPU和磁盘的数量。
您的示例:
逻辑读 276 ,物理读1,预读274
答案 1 :(得分:1)
逻辑读取是从缓存中读取数据页,无论它是否已经在缓存中。查询总是从内存中读取数据,而不是直接从磁盘上读取。
在这种情况下,看起来好像是使用预读从磁盘读取了数据。但是,即使不使用预读功能,您仍将具有相同的逻辑读取,因为使用单页IO,全范围读取或多范围预读功能将页面带入缓存并不重要。 / p>