INNER JOINも機能する場合に、CROSS APPLYが違いを生むときの良い例を誰かに教えてもらえますか?
パフォーマンスの詳細な比較については、ブログの記事を参照してください:
-
INNER JOIN
vs.CROSS APPLY
CROSS APPLY
単純なJOIN
がないものでより効果的に機能します 状態。
これは3
を選択します t2
からの最後のレコード t1
のレコードごとに :
SELECT t1.*, t2o.*
FROM t1
CROSS APPLY
(
SELECT TOP 3 *
FROM t2
WHERE t2.t1_id = t1.id
ORDER BY
t2.rank DESC
) t2o
INNER JOIN
では簡単に定式化できません 状態。
CTE
を使用してそのようなことを行うことができます とウィンドウ関数:
WITH t2o AS
(
SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
FROM t2
)
SELECT t1.*, t2o.*
FROM t1
INNER JOIN
t2o
ON t2o.t1_id = t1.id
AND t2o.rn <= 3
、ただし、これは読みにくく、おそらく効率が低くなります。
更新:
チェックしたばかりです。
マスターコード> 約
20,000,000
のテーブルです PRIMARY KEY
のレコード id
に 。
このクエリ:
WITH q AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM master
),
t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
JOIN q
ON q.rn <= t.id
ほぼ30
で実行されます 秒、これは:
WITH t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
CROSS APPLY
(
SELECT TOP (t.id) m.*
FROM master m
ORDER BY
id
) q
瞬時です。