web-dev-qa-db-ja.com

CROSS APPLY vs INNER JOIN

CROSS APPLYINNER JOIN最近。私はいくつかのクエリを書いてみましたが、どちらも同じように機能し、実行計画も同じようです。

たぶん、より深い知識を持つ誰かが私にこれらの2つの違いは何であるかを説明できますか?

OUTER APPLY (SELECT UserID
                , ActionPerformedDate = MAX(ActionDate)
            FROM dbo.AdminUsage
            WHERE SubscriberID = S.SubscriberID
                AND ActionPerformed = 'Some Action'
                AND Description = 'True'
            GROUP BY UserID) AS AU


LEFT JOIN (SELECT SubscriberID
                , UserID
                , MAX(ActionDate) OVER(PARTITION BY SubscriberID) AS ActionPerformedDate
            FROM dbo.AdminUsage
            WHERE ActionPerformed = 'Some Action'
                AND Description = 'True') AS AU
    ON AU.SubscriberID = S.SubscriberID

この場合、推奨されるアプローチはありますか?

3

これらは、例のように、同じ目的で使用できる2つのわずかに異なる動物です。ただし、CROSS APPLYは、テーブル値関数を「結合」し、XMLドキュメントを「拡張」するための唯一のオプションです。

一部のクエリ、特に並列クエリでは、必要なプロセッサスレッドとインデックス作成戦略があれば、CROSS APPLYを使用するとパフォーマンスが大幅に向上します。

Microsoft MVP Itzik Ben-Ganは、いくつかの優れた例を この講演 で詳しく説明しています。

5