【发布时间】:2014-12-03 00:53:29
【问题描述】:
我使用SQL Server 2012 并编写此查询:
DBCC DROPCLEANBUFFERS;
SET STATISTICS IO ON;
我在上面写了两行用于清洁现金并设置统计信息。
这些是我的查询:
SELECT C.custid, C.companyname, O.orderid, O.orderdate
FROM Sales.Customers AS C
INNER JOIN Sales.Orders AS O
ON C.custid = O.custid
SELECT C.custid, C.companyname, O.orderid, O.orderdate
FROM Sales.Customers AS C
INNER JOIN Sales.Orders AS O
ON C.custid = O.custid
WHERE O.custid < 5
但我得到了这个统计数据:
对于第一个查询: (受影响的 830 行) 表“工作台”。扫描计数 0,逻辑读取 0,物理读取 0, 预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。 表“订单”。扫描计数 1,逻辑读取 21,物理读取 1, 预读读取 25,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。 表“客户”。扫描计数 1,逻辑读取 2,物理读取 1, 预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
对于第二个查询: (30 行受影响) 表“客户”。扫描计数 0,逻辑读取 60,物理读取 1, 预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。 表“订单”。扫描计数 1,逻辑读取 21,物理读取 0,预读读取 0, lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
考虑到行数,为什么第二个查询中的logical reads 比第一个要多?
【问题讨论】:
标签: sql-server sql-server-2012 query-optimization