请考虑在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