Jaki jest główny cel korzystania z aplikacji CROSS APPLY ?
Przeczytałem (niejasno przez posty w Internecie), które cross applymogą być bardziej wydajne przy wybieraniu dużych zestawów danych, jeśli partycjonujesz. (Przychodzi mi na myśl stronicowanie)
Wiem również, że CROSS APPLYnie wymaga UDF jako prawej tabeli.
W większości INNER JOINzapytań (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 APPLYrobi różnicę w tych przypadkach, w których również INNER JOINbę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 applyjest 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 APPLYma swoje oczywiste zastosowanie, pozwalając na zależność zestawu od innego (w przeciwieństwie do JOINoperatora), 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, APPLYkiedy potrzebujesz, ale nie nadużywaj go JOIN.
