使用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
在CROSS APPLY在INNER JOIN也将起作用的情况下,CROSS APPLY有所作为时,谁能给我一个很好的例子?
有关性能比较的详细信息,请参见我的博客中的文章:
INNER JOIN 与 CROSS APPLYCROSS APPLY在没有简单JOIN条件的情况下效果更好。
这是3从中t2为每个记录选择最后一个记录t1:
SELECT t1.*, t2o.*
FROM t1
CROSS APPLY
(
SELECT TOP 3 *
FROM t2
WHERE t2.t1_id = t1.id
ORDER BY
t2.rank DESC
) t2o
不能轻易地将其与INNER JOIN条件结合起来。
您可能可以使用CTE和的window函数执行类似的操作:
WITH t2o AS
(
SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
FROM t2
)
SELECT t1.*, t2o.*
FROM t1
INNER JOIN
t2o
ON t2o.t1_id = t1.id
AND t2o.rn <= 3
,但是可读性较低,效率可能较低。
更新:
刚刚检查。
master是的有关表的20,000,000一个记录PRIMARY KEY上id。
该查询:
WITH q AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM master
),
t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
JOIN q
ON q.rn <= t.id
运行了将近30几秒钟,而这一个:
WITH t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
CROSS APPLY
(
SELECT TOP (t.id) m.*
FROM master m
ORDER BY
id
) q
是即时的。
问题内容: 我想知道什么时候应该包括外部脚本或将它们与html代码内联,以提高性能和简化维护。 一般做法是什么? 真实场景-我有几个需要客户端表单验证的html页面。为此,我使用了所有这些页面中都包含的jQuery插件。但是问题是,我是否: 编写代码位以内联方式配置此脚本? 在所有这些html页面之间共享的一个文件中包含所有位? 将每个位都包含在一个单独的外部文件中,每个html页面一个? 谢谢。
问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮助。但是,在发送流数据时,等待A
问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或
问题内容: 在集成我以前从未使用过的Django应用程序时,我发现了用于定义类中函数的两种不同方式。作者似乎非常有意地使用了它们。第一个是我自己经常使用的: 另一个是我不使用的,主要是因为我不知道何时使用它,以及什么用途: 在Python文档中,装饰器的解释如下: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想指的是自己(而不是实例)。我不完全理解为什么会这样,因为我总是可
问题内容: 一个理想的例子是什么时候确切地使用Java中的特定接口,以及适用的任何特定规则。 问题答案: 集合框架是一个不错的选择。 因此,你可以编写如下代码: 如果将来你想使用say 或自己的界面更改实现,那么你要做的就是将第一行更改为: 其余代码将继续进行。
问题内容: 我看过各种文章,但我仍然不知道为什么不应该使用它。请让我知道您的想法。 问题答案: 我发现有必要在错误的设计中使用instanceof提示。可以肯定的是,将会出现一个大型,复杂的开关风格的构造。在我看到的其他大多数情况下,我们应该使用多态而不是instanceof。请参阅策略模式。(相关的使用示例) 我唯一需要使用的是实现时。