派生表执行一次还是三次?

时间:2010-05-04 18:45:48

标签: sql sql-server tsql

  

每次使用派生表时,都会执行该查询。使用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

感谢名单

3 个答案:

答案 0 :(得分:2)

不应该是一次通过,看看执行计划

这是一个示例,其中将为表table2中的每一行运行某些内容

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

这样的东西会运行计数将触发table2表中的每一行

答案 1 :(得分:2)

CTE或嵌套(不相关)子查询通常没有不同的执行计划。是否使用CTE或子查询从未对我的假脱机中间查询产生影响。

关于Tony Rogerson链接 - 显式临时表比CTE的自连接表现更好,因为它的索引更好 - 当你超越声明性SQL并开始预测引擎的工作过程时,很多次,你可以得到更好的结果。

有时,使用多个分层CTE而不是复杂的多临时表进程的更简单且更易维护的查询的好处超过了多表进程的性能优势。基于CTE的方法是单个SQL语句,不会被意外注释掉的步骤或模式更改而悄然破坏。

答案 2 :(得分:1)

可能不是,但它可能会对派生结果进行假脱机,因此只需要访问一次。

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

引用来自哪里?