Apa tujuan utama penggunaan CROSS APPLY ?
Saya telah membaca (samar-samar, melalui posting di Internet) yang cross applybisa lebih efisien ketika memilih lebih dari set data besar jika Anda mempartisi. (Paging datang ke pikiran)
Saya juga tahu bahwa CROSS APPLYtidak memerlukan UDF sebagai tabel kanan.
Dalam sebagian besar INNER JOINkueri (hubungan satu-ke-banyak), saya bisa menulis ulang untuk digunakan CROSS APPLY, tetapi mereka selalu memberi saya rencana eksekusi yang setara.
Adakah yang bisa memberi saya contoh yang baik ketika CROSS APPLYmembuat perbedaan dalam kasus-kasus di mana INNER JOINakan bekerja juga?
Edit:
Berikut ini contoh sepele, di mana rencana eksekusi persis sama. (Tunjukkan satu di mana mereka berbeda dan di mana cross applylebih cepat / lebih efisien)
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 APPLYmemiliki penggunaan yang jelas dalam memungkinkan satu set untuk bergantung pada yang lain (tidak seperti JOINoperator), tetapi itu tidak datang tanpa biaya: itu berperilaku seperti fungsi yang beroperasi pada setiap anggota set kiri , jadi, dalam istilah SQL Server itu selalu melakukan Loop Join, yang hampir tidak pernah merupakan cara terbaik untuk bergabung dengan set. Jadi, gunakan APPLYsaat Anda perlu, tetapi jangan terlalu sering menggunakannya JOIN.
