Quel est le but principal de l'utilisation de CROSS APPLY ?
J'ai lu (vaguement, à travers des messages sur Internet) que l'application croisée peut être plus efficace lors de la sélection sur de grands ensembles de données si vous partitionnez. (La pagination me vient à l'esprit)
Je sais aussi que CROSS APPLY n'a pas besoin d'un UDF comme table de droite.
Dans la plupart des requêtes INNER JOIN (relations un à plusieurs), je pourrais les réécrire pour utiliser CROSS APPLY, mais elles me donnent toujours des plans d'exécution équivalents.
Quelqu'un peut-il me donner un bon exemple de cas où CROSS APPLY fait une différence dans les cas où INNER JOIN fonctionne aussi bien ?
Edit :
Voici un exemple trivial, où les plans d'exécution sont exactement les mêmes. (Montrez-moi un exemple où ils diffèrent et où l'application croisée est plus rapide ou 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
55 votes
Je sais que je suis encore plus pointilleux, mais le mot "performant" existe bel et bien. Il n'est simplement pas lié à l'efficacité.
3 votes
C'est très utile pour la vérification de sql xquery. este .
4 votes
Il semble que l'utilisation de la "jointure en boucle intérieure" serait très proche de l'application croisée. J'aurais aimé que votre exemple précise quel indice de jointure est équivalent. Le fait de dire "jointure" peut donner lieu à "boucle interne", "fusion" ou même "autre", car elle peut être réorganisée avec d'autres jointures.
4 votes
Lorsque la jointure va créer beaucoup de lignes mais que vous n'avez besoin d'évaluer qu'une seule jointure de ligne à la fois. J'ai eu un cas où j'avais besoin d'une auto-jonction sur une table de plus de 100 millions de lignes et la mémoire était tout simplement insuffisante. J'ai donc utilisé le curseur pour réduire l'empreinte mémoire. A partir du curseur, je suis passé à l'application croisée qui gérait toujours l'empreinte mémoire et était 1/3 plus rapide que le curseur.
1 votes
D'après mon expérience, Cross-Apply est plus rapide dans la plupart des cas (par exemple pour la création de rapports), mais lors de l'exportation d'enregistrements (des dizaines de milliers ou plus), il sera inférieur à un hash-join sur une requête dérivée. YMMV
12 votes
CROSS APPLY
a son utilisation évidente en permettant à un ensemble de dépendre d'un autre (contrairement à la fonctionJOIN
), mais cela n'a pas un coût : elle se comporte comme une fonction qui opère sur chaque membre de l'opérateur gauche donc, en termes de SQL Server, il exécute toujours unLoop Join
ce qui n'est presque jamais la meilleure façon de joindre des ensembles. Il faut donc utiliserAPPLY
quand vous en avez besoin, mais ne l'utilisez pas trop contreJOIN
.1 votes
Avec un opérateur JOIN, les deux entrées représentent des relations statiques. Avec APPLY, le côté gauche est une relation statique, mais le côté droit peut être une expression de table avec des corrélations avec les éléments de la table de gauche. Référencé dans le kit de formation 70-461.
2 votes
Le lien fourni "ne nécessite pas un UDF comme table de droite" ne fonctionne plus.