Sub查询与join的性能

时间:2017-03-08 06:22:11

标签: sql-server join

我正在执行以下两个查询并捕获估计的子树成本以及统计时间

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 }。

那么,表现更好的结论是什么?

1 个答案:

答案 0 :(得分:0)

预计时间可能会产生误导。只有实时服务器统计信息是实时的和更新的,因此localserver或类似服务器的内容不会反映实际的估计时间。

其他一点是,这两个查询都不行。这两个查询的真实版本是

Select tblProducts.Id, Name, Description from tblProducts inner join tblProductSales on tblProducts.Id = tblProductSales.ProductId group by tblProducts.Id, Name, Description

或类似的东西不关心语法。因此,在查看统计信息之前,您必须考虑“这是此查询的最佳版本吗?”如果您的答案是肯定的,那么请考虑统计数据,然后您的统计结果会更有意义。