使用CROSS APPLY的主要目的是什么?
我已经读过(模糊地通过Internet上的帖子),cross apply
如果您要进行分区,则在选择大型数据集时可能会更有效率。(想起分页)
我也知道,CROSS APPLY
不需要UDF作为右表。
在大多数INNER JOIN
查询(一对多关系)中,我可以将它们重写为use CROSS APPLY
,但它们始终会为我提供等效的执行计划。
谁能给我一个很好的例子,说明在CROSS APPLY
哪些情况下INNER JOIN
行之有效的情况下也有所作为?
编辑:
这是一个简单的示例,其中执行计划完全相同。(向我展示它们的不同之处以及cross apply
更快/更高效的地方)
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
在允许一个集合依赖另一个集合上有其明显的用法(不同于JOIN
运算符),但这并不是没有代价的:它的行为就像一个对左集合的每个成员进行操作的函数,因此,按照SQL Server的说法,总是执行Loop Join
,这几乎绝不是加入集合的最佳方法。因此,请APPLY
在需要时使用,但不要对过度使用它JOIN
。