¿Cuál es el propósito principal de usar CROSS APPLY ?
He leído (vagamente, a través de publicaciones en Internet) que cross applypuede 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 APPLYno requiere un UDF como la tabla correcta.
En la mayoría de las INNER JOINconsultas (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 APPLYmarca la diferencia en aquellos casos en INNER JOINque 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 applyes 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 APPLYtiene su uso obvio al permitir que un conjunto dependa de otro (a diferencia del JOINoperador), 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 APPLYcuando lo necesite, pero no lo use en exceso JOIN.
