Някой може ли да ми даде добър пример за това кога CROSS APPLY прави разлика в случаите, когато INNER JOIN също ще работи?
Вижте статията в моя блог за подробно сравнение на производителността:
INNER JOIN
срещу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
's и функция прозорец:
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
, но това е по-малко четливо и вероятно по-малко ефективно.
Актуализация:
Току-що проверено.
master
е таблица от около 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
е моментално.