Was ist der Hauptzweck von CROSS APPLY ?
Ich habe (vage durch Beiträge im Internet) gelesen, dass cross apply
es effizienter sein kann, wenn Sie über große Datenmengen auswählen, wenn Sie partitionieren. (Paging kommt mir in den Sinn)
Ich weiß auch, dass CROSS APPLY
keine UDF als richtige Tabelle erforderlich ist.
In den meisten INNER JOIN
Abfragen (Eins-zu-Viele-Beziehungen) konnte ich sie zur Verwendung umschreiben CROSS APPLY
, aber sie geben mir immer gleichwertige Ausführungspläne.
Kann mir jemand ein gutes Beispiel geben, wann CROSS APPLY
es in den Fällen, in denen INNER JOIN
es auch funktioniert, einen Unterschied macht ?
Bearbeiten:
Hier ist ein einfaches Beispiel, bei dem die Ausführungspläne genau gleich sind. (Zeigen Sie mir, wo sie sich unterscheiden und wo sie cross apply
schneller / effizienter sind)
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
hat seine offensichtliche Verwendung darin, zuzulassen, dass ein Satz von einem anderen abhängt (im Gegensatz zum JOIN
Operator), aber das ist nicht ohne Kosten: Es verhält sich wie eine Funktion, die über jedes Mitglied des linken Satzes ausgeführt wird, also in SQL Server-Begriffen Führen Sie immer eine aus Loop Join
, was fast nie der beste Weg ist, um Sets zu verbinden. Verwenden APPLY
Sie es also, wenn Sie es brauchen, aber verwenden Sie es nicht zu stark JOIN
.