Qual è lo scopo principale dell'utilizzo di CROSS APPLY ?
Ho letto (vagamente, tramite post su Internet) che cross apply
può essere più efficiente quando si selezionano set di dati di grandi dimensioni se si esegue il partizionamento. (Mi viene in mente il paging)
So anche che CROSS APPLY
non richiede un UDF come tabella di destra.
Nella maggior parte delle INNER JOIN
query (relazioni uno-a-molti), potrei riscriverle per l'uso CROSS APPLY
, ma mi danno sempre piani di esecuzione equivalenti.
Qualcuno può darmi un buon esempio di quando CROSS APPLY
fa la differenza in quei casi in cui INNER JOIN
funzionerà anche?
Modificare:
Ecco un esempio banale, in cui i piani di esecuzione sono esattamente gli stessi. (Mostramene uno dove differiscono e dove cross apply
è più veloce / più efficiente)
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
ha il suo ovvio utilizzo nel consentire a un set di dipendere da un altro (a differenza JOIN
dell'operatore), ma ciò non comporta costi: si comporta come una funzione che opera su ciascun membro del set di sinistra , quindi, in termini di SQL Server esegui sempre a Loop Join
, che non è quasi mai il modo migliore per unire i set. Quindi, usa APPLY
quando è necessario, ma non abusarne JOIN
.