Sql Server - OUTER APPLY versus Sub-queries [закрыто]

Пожалуйста, рассмотрите следующие 2 оператора в Sql Server:

Этот использует вложенные подзапросы:

    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

А этот использует оператор OUTER APPLY:

    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 будет работать лучше.

Еще пара вопросов:

  1. Я почти уверен в этом, но все же хотел бы подтвердить, что в первом решении CTE будет выполняться дважды (потому что на него ссылаются дважды, а CTE разворачивается в строку, как макрос).
  2. Будет ли CTE выполняться один раз для каждой строки при использовании в операторе OUTER APPLY? Также будет ли он выполняться для каждой строки при использовании во вложенном запросе в первом операторе?
7
задан r_honey 11 August 2014 в 16:52
поделиться