【发布时间】:2010-11-11 11:15:24
【问题描述】:
使用CROSS APPLY的主要目的是什么?
我已经读到(模糊地,通过 Internet 上的帖子)cross apply 在选择大型数据集时可以更有效,如果您正在分区。 (想到分页)
我也知道CROSS APPLY 不需要 UDF 作为右表。
在大多数INNER JOIN 查询(一对多关系)中,我可以将它们重写为使用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
【问题讨论】:
-
我知道这对我来说更挑剔,但“性能”绝对是一个词。它只是与效率无关。
-
对sql xquery非常有用。检查this。
-
似乎使用“内循环连接”将非常接近交叉应用。我希望您的示例详细说明哪个连接提示是等效的。只是说加入可能会导致内部/循环/合并甚至“其他”,因为它可能会与其他联接重新排列。
-
当连接将创建很多行但您一次只需要评估一个行连接时。我有一个案例,我需要在一个超过 1 亿行的表上进行自连接,并且内存不足。所以我用光标来降低内存占用。从游标开始,我交叉应用为仍受管理的内存占用,并且比游标快 1/3。
-
CROSS APPLY在允许一个集合依赖另一个集合方面具有明显的用途(与JOIN运算符不同),但这并非没有代价:它的行为就像一个在left 集合的每个成员,因此,在 SQL Server 术语中,它总是执行Loop Join,这几乎不是连接集合的最佳方式。所以,在需要的时候使用APPLY,但不要过度使用JOIN。
标签: sql sql-server performance tsql cross-apply