Quel est l'objectif principal de CROSS APPLY ?
J'ai lu (vaguement, à travers des publications sur Internet) qui cross apply
peut être plus efficace lors de la sélection de plus grands ensembles de données si vous partitionnez. (La pagination vient à l'esprit)
Je sais également que CROSS APPLY
cela ne nécessite pas un UDF comme table de droite.
Dans la plupart des INNER JOIN
requêtes (relations un-à-plusieurs), je pouvais les réécrire pour les utiliser CROSS APPLY
, mais elles me donnent toujours des plans d'exécution équivalents.
Quelqu'un peut-il me donner un bon exemple du moment où cela CROSS APPLY
fait une différence dans les cas où INNER JOIN
cela fonctionnera également?
Éditer:
Voici un exemple trivial, où les plans d'exécution sont exactement les mêmes. (Montrez-moi celui où ils diffèrent et où cross apply
est plus rapide / plus efficace)
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
a son utilisation évidente en permettant à un ensemble de dépendre d'un autre (contrairement à l' JOIN
opérateur), mais cela ne vient pas sans coût: il se comporte comme une fonction qui opère sur chaque membre de l' ensemble gauche , donc, en termes SQL Server, il effectuez toujours un Loop Join
, ce qui n'est presque jamais le meilleur moyen de joindre des ensembles. Donc, utilisez-le APPLY
quand vous en avez besoin, mais n'en abusez pas JOIN
.