Was ist der Hauptzweck von CROSS APPLY ?
Ich habe (vage durch Beiträge im Internet) gelesen, dass cross applyes 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 APPLYkeine UDF als richtige Tabelle erforderlich ist.
In den meisten INNER JOINAbfragen (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 APPLYes in den Fällen, in denen INNER JOINes 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 applyschneller / 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 APPLYhat seine offensichtliche Verwendung darin, zuzulassen, dass ein Satz von einem anderen abhängt (im Gegensatz zum JOINOperator), 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 APPLYSie es also, wenn Sie es brauchen, aber verwenden Sie es nicht zu stark JOIN.
