請考慮在SQL Server中的以下2個語句:SQL服務器 - OUTER APPLY與子查詢
這一個是使用嵌套子查詢:
WITH cte AS
(
SELECT TOP 100 PERCENT *
FROM Segments
ORDER BY InvoiceDetailID, SegmentID
)
SELECT *, ReturnDate =
(SELECT TOP 1 cte.DepartureInfo
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID),
DepartureCityCode =
(SELECT TOP 1 cte.DepartureCityCode
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID)
FROM Segments seg
而這種使用外部應用運算符:
WITH cte AS
(
SELECT TOP 100 PERCENT *
FROM Segments
ORDER BY InvoiceDetailID, SegmentID
)
SELECT seg.*, t.DepartureInfo AS ReturnDate, t.DepartureCityCode
FROM Segments seg OUTER APPLY (
SELECT TOP 1 cte.DepartureInfo, cte.DepartureCityCode
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID
) t
考慮到兩個Segments表可能有數百萬行,這兩個表中的哪一個可能執行得更好?
我的直覺是OUTER APPLY會表現更好。
一對夫婦的更多的問題:
- 我幾乎敢肯定這一點,但還是想證實的是,在第一個方案中,CTE將有效地執行兩次(因爲其引用了兩次和熱膨脹係數像宏一樣內聯展開)。
- 當在OUTER APPLY運算符中使用時,CTE是否會針對每行執行一次?當在第一個語句的嵌套查詢中使用時,它也會爲每一行執行?
運行,檢查查詢計劃 – 2011-03-25 15:53:00
「TOP 100 PERCENT ... ORDER BY」已被優化,並且沒有任何效果。我同意第二個應該表現更好。你也可以看看'ROW_NUMBER'和'PARTITION BY'來獲得每個組的'TOP 1'。 – 2011-03-25 16:00:44