2010-05-04 49 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語句,不能像意外註釋或模式更改那樣被安靜地破壞。

相關問題