Яка головна мета використання CROSS APPLY ?
Я читав (невиразно, через публікації в Інтернеті), які cross apply
можуть бути ефективнішими при виборі великих наборів даних, якщо ви розділяєте їх. (Пейджинг приходить на думку)
Я також знаю, що CROSS APPLY
не потрібен UDF як права таблиця.
У більшості INNER JOIN
запитів (один на багато відносин) я міг би переписати їх на використання CROSS APPLY
, але вони завжди дають мені еквівалентні плани виконання.
Чи може хтось надати мені хороший приклад того, коли зміниться CROSS APPLY
ситуація в тих випадках, коли також INNER JOIN
буде працювати?
Редагувати:
Ось банальний приклад, коли плани виконання рівно однакові. (Покажіть мені, де вони відрізняються і де cross apply
швидше / ефективніше)
create table Company (
companyId int identity(1,1)
, companyName varchar(100)
, zipcode varchar(10)
, constraint PK_Company primary key (companyId)
)
GO
create table Person (
personId int identity(1,1)
, personName varchar(100)
, companyId int
, constraint FK_Person_CompanyId foreign key (companyId) references dbo.Company(companyId)
, constraint PK_Person primary key (personId)
)
GO
insert Company
select 'ABC Company', '19808' union
select 'XYZ Company', '08534' union
select '123 Company', '10016'
insert Person
select 'Alan', 1 union
select 'Bobby', 1 union
select 'Chris', 1 union
select 'Xavier', 2 union
select 'Yoshi', 2 union
select 'Zambrano', 2 union
select 'Player 1', 3 union
select 'Player 2', 3 union
select 'Player 3', 3
/* using CROSS APPLY */
select *
from Person p
cross apply (
select *
from Company c
where p.companyid = c.companyId
) Czip
/* the equivalent query using INNER JOIN */
select *
from Person p
inner join Company c on p.companyid = c.companyId
CROSS APPLY
має своє очевидне використання в тому, щоб набір залежав від іншого (на відміну від JOIN
оператора), але це не виходить без витрат: він поводиться як функція, яка працює над кожним членом лівого набору, так що, в умовах SQL Server, це завжди виконайте а Loop Join
, що майже ніколи не є найкращим способом приєднатися до наборів. Тож використовуйте, APPLY
коли потрібно, але не зловживайте цим JOIN
.