¿Cuál es el propósito principal de usar CROSS APPLY?¿Cuándo debo usar Cross Apply over Inner Join?
He leído (vagamente, a través de publicaciones en Internet) que cross apply
puede ser más eficiente al seleccionar conjuntos de datos grandes si está creando particiones. (Paging viene a la mente)
también sé que CROSS APPLY
doesn't require a UDF as the right-table.
En la mayoría de INNER JOIN
consultas (uno a muchos), pude volver a extender el uso CROSS APPLY
, pero siempre me dan los planes de ejecución equivalentes.
¿Alguien me puede dar un buen ejemplo de cuándo CROSS APPLY
hace una diferencia en aquellos casos en que INNER JOIN
funcionará también?
Editar:
Aquí está un ejemplo trivial, donde los planes de ejecución son exactamente los mismos. (Muéstrame una en la que se diferencian y donde cross apply
es más rápido/más eficiente)
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
Sé que esto es incluso PICKIER de mí, pero 'performant' es definitivamente una palabra. Simplemente no está relacionado con la eficiencia. – Rire1979
Es muy útil para sql xquery. compruebe [esto] (http://stackoverflow.com/a/10511719/474679). – ARZ
Parece que usar "unión de bucle interno" sería muy similar a la aplicación cruzada. Me gustaría que tu ejemplo detallara qué sugerencia de unión era equivalente. Simplemente diciendo join podría resultar en inner/loop/merge o incluso "other" porque puede volver a organizarse con otras uniones. – crokusek