Jaki jest główny cel korzystania z aplikacji CROSS APPLY ?
Przeczytałem (niejasno przez posty w Internecie), które cross apply
mogą być bardziej wydajne przy wybieraniu dużych zestawów danych, jeśli partycjonujesz. (Przychodzi mi na myśl stronicowanie)
Wiem również, że CROSS APPLY
nie wymaga UDF jako prawej tabeli.
W większości INNER JOIN
zapytań (relacje jeden do wielu) mogłem przepisać je na potrzeby używania CROSS APPLY
, ale zawsze dają mi one równoważne plany wykonania.
Czy ktoś może mi podać dobry przykład, kiedy CROSS APPLY
robi różnicę w tych przypadkach, w których również INNER JOIN
będzie działać?
Edytować:
Oto prosty przykład, w którym plany wykonania są dokładnie takie same. (Pokaż mi, gdzie się różnią i gdzie cross apply
jest szybszy / bardziej wydajny)
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
ma swoje oczywiste zastosowanie, pozwalając na zależność zestawu od innego (w przeciwieństwie do JOIN
operatora), ale nie jest to bez kosztów: zachowuje się jak funkcja, która działa na każdym elemencie lewego zestawu, więc w SQL Server to znaczy zawsze wykonuj Loop Join
, co prawie nigdy nie jest najlepszym sposobem łączenia zestawów. Więc używaj, APPLY
kiedy potrzebujesz, ale nie nadużywaj go JOIN
.