Was ist der Hauptzweck der Verwendung von CROSS APPLY ?
Ich habe (vage, durch Beiträge im Internet) gelesen, dass cross apply
kann bei der Auswahl über große Datenmengen effizienter sein, wenn Sie diese partitionieren. (Paging kommt mir in den Sinn)
Ich weiß auch, dass CROSS APPLY
erfordert keine UDF als rechte Tabelle.
In den meisten INNER JOIN
Abfragen (Eins-zu-Viel-Beziehungen), könnte ich sie umschreiben, um die CROSS APPLY
aber sie geben mir immer gleichwertige Ausführungspläne.
Kann mir jemand ein gutes Beispiel dafür nennen, wann CROSS APPLY
macht einen Unterschied in den Fällen, in denen INNER JOIN
auch funktionieren wird?
Editar:
Hier ist ein triviales Beispiel, bei dem die Ausführungspläne genau gleich sind. (Zeigen Sie mir einen, wo sie sich unterscheiden und wo cross apply
schneller/effizienter ist)
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