¿Cuál es el propósito principal de usar CROSS APPLY ?
He leído (vagamente, a través de publicaciones en Internet) que cross apply
puede ser más eficiente al seleccionar sobre conjuntos de datos grandes si está particionando. (La paginación viene a la mente)
También sé que CROSS APPLY
no requiere un UDF como la tabla correcta.
En la mayoría de las INNER JOIN
consultas (relaciones uno a muchos), podría reescribirlas para usarlas CROSS APPLY
, pero siempre me dan planes de ejecución equivalentes.
¿Alguien puede darme un buen ejemplo de cuándo CROSS APPLY
marca la diferencia en aquellos casos en INNER JOIN
que funcionará también?
Editar:
Aquí hay un ejemplo trivial, donde los planes de ejecución son exactamente los mismos. (Muéstrame uno donde difieren 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
CROSS APPLY
tiene su uso obvio al permitir que un conjunto dependa de otro (a diferencia del JOIN
operador), pero eso no tiene un costo: se comporta como una función que opera sobre cada miembro del conjunto izquierdo , por lo que, en términos de SQL Server, siempre realice un Loop Join
, que casi nunca es la mejor manera de unir conjuntos. Por lo tanto, úselo APPLY
cuando lo necesite, pero no lo use en exceso JOIN
.