我正在执行以下两个查询并捕获估计的子树成本以及统计时间
SET STATISTICS TIME ON
DROPCLEANBUFFERS;
DBCC FREEPROCCACHE
Select Id, Name, Description
from tblProducts
where ID IN
(
Select ProductId from tblProductSales
)
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE
Select distinct tblProducts.Id, Name, Description
from tblProducts
inner join tblProductSales
on tblProducts.Id = tblProductSales.ProductId
所以,我得到的结果是
估计的子树成本(子查询) - 0.458276 估计子树成本(加入) - 0.458982
统计时间(子查询):
SQL Server解析和编译时间: CPU时间= 16 ms,经过时间= 163 ms。
(7063行(s)受影响)
SQL Server执行时间:
CPU时间= 109毫秒,经过时间= 726毫秒。
统计时间(加入):
SQL Server解析和编译时间: CPU时间= 16 ms,经过时间= 654 ms。
(7063行(s)受影响)
(1行受影响)
SQL Server执行时间: CPU时间= 62 ms,经过时间= 624 ms。
因此,我们可以看到join
CPU时间(62 ms)小于subquery
CPU时间(109 ms),但join
的估算子树成本高于subquery
}。
那么,表现更好的结论是什么?
答案 0 :(得分:0)
预计时间可能会产生误导。只有实时服务器统计信息是实时的和更新的,因此localserver或类似服务器的内容不会反映实际的估计时间。
其他一点是,这两个查询都不行。这两个查询的真实版本是
Select tblProducts.Id, Name, Description
from tblProducts
inner join tblProductSales
on tblProducts.Id = tblProductSales.ProductId
group by tblProducts.Id, Name, Description
或类似的东西不关心语法。因此,在查看统计信息之前,您必须考虑“这是此查询的最佳版本吗?”如果您的答案是肯定的,那么请考虑统计数据,然后您的统计结果会更有意义。