2010-05-04 33 views
0

您使用派生表的每一次,该查询将被执行。在使用CTE时,该结果集在单个查询中仅被撤回一次。是派生表执行一次还是三次?

是否报价表明,下面的查询将导致它的派生表(每个聚合函数的调用一次)被执行三次:

SELECT 
    AVG(OrdersPlaced),MAX(OrdersPlaced),MIN(OrdersPlaced) 
    FROM (
    SELECT 
     v.VendorID, 
     v.[Name] AS VendorName, 
     COUNT(*) AS OrdersPlaced 
    FROM Purchasing.PurchaseOrderHeader AS poh 
    INNER JOIN Purchasing.Vendor AS v ON poh.VendorID = v.VendorID 
    GROUP BY v.VendorID, v.[Name] 
) AS x 

感谢名单

回答

1

大概不会,但它可以在后台导出结果,因此只需要一次访问。

在这种情况下,应该有一个CTE和派生表之间没有差别。

在哪里引述?

+0

“报价从哪里来?” http://facility9.com/2008/12/09/a-quick-introduction-to-common-table-expressions – AspOnMyNet 2010-05-04 19:11:18

+0

“但它可以在后台导出结果,因此只需要一次访问。”线轴是什么意思? – AspOnMyNet 2010-05-04 19:11:52

+1

它可能会生成一个内部临时表,以避免3次读取派生表。 “spool”是您在查询计划 – gbn 2010-05-04 19:12:46

2

不应该是一个合格,看看执行计划

这里是一个例子,表中的每一行都会运行表2

select *,(select COUNT(*) from table1 t1 where t1.id <= t2.id) as Bla 
    from table2 t2 

这样的东西有一个正在运行的计数将触发每一行的表2表

2

CTE或嵌套(不相关)子查询通常将具有无异执行计划。是否使用CTE或子查询从未影响我的中间查询被假脱机。

关于托尼罗杰森链接 - 显式临时表执行比自联接到CTE更好,因为它的索引更好 - 当您超越声明式SQL并开始预测引擎的工作过程时,你可以得到更好的结果。

有时候,有许多分层热膨胀系数,而不是远远超过多台过程的性能优势复杂的多的临时表的过程更简单,更易于维护的查询的好处。基于CTE的方法是一个单一的SQL语句,不能像意外注释或模式更改那样被安静地破坏。