Qual é o principal objetivo do uso do CROSS APPLY ?
Li (vagamente, através de postagens na Internet) que cross apply
podem ser mais eficientes ao selecionar conjuntos de dados grandes, se você estiver particionando. (Paginação vem à mente)
Eu também sei que CROSS APPLY
não requer uma UDF como a tabela correta.
Na maioria das INNER JOIN
consultas (relacionamentos um para muitos), eu poderia reescrevê-las para uso CROSS APPLY
, mas elas sempre me oferecem planos de execução equivalentes.
Alguém pode me dar um bom exemplo de quando CROSS APPLY
faz a diferença nos casos em que INNER JOIN
também funcionará?
Editar:
Aqui está um exemplo trivial, onde os planos de execução são exatamente os mesmos. (Mostre-me onde eles diferem e onde cross apply
é mais rápido / mais 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
tem seu uso óbvio em permitir que um conjunto dependa de outro (diferente do JOIN
operador), mas isso não tem um custo: ele se comporta como uma função que opera sobre cada membro do conjunto esquerdo ; portanto, nos termos do SQL Server, sempre execute a Loop Join
, que quase nunca é a melhor maneira de juntar conjuntos. Portanto, use APPLY
quando precisar, mas não use demais JOIN
.