The*_*iot 8 cte t-sql subquery cross-apply
我遇到了这样的查询:
SELECT (SELECT COUNT(1) FROM Orders o WHERE i.ItemId = o.ItemId) [C]
FROM Items i
Run Code Online (Sandbox Code Playgroud)
我将其更改为以下
;WITH cte_count
AS
(
SELECT COUNT(1) c, OrderId FROM Orders Group By ItemId
)
SELECT a.c [Count], i.Name
FROM Items i
INNER JOIN cte_count c ON (c.ItemId = i.ItemId)
Run Code Online (Sandbox Code Playgroud)
但两者的执行计划如下所示:
同样,还有另一个查询选择TOP 1 Order By Id
. 我尝试将这个移动到CROSS APPLY
但是对于这个,我也得到了相同的执行计划。
当然,查询中还有其他连接和列。
我的困境是关于使用CROSS APPLY
and 的实用性和优势CTE
。有没有或只是异国情调?
Pau*_*ite 22
但两者的执行计划如下所示:
计划不同。一个是内连接,另一个是外连接。在您的简单测试中,结果可能相同,但语义不同。在更复杂的查询中,差异可能会导致更明显的不同执行计划,并带来性能影响。
通常有很多方法可以在 SQL 中表达相同的要求(或类似的要求,如您的示例)。您使用的最初是偏好和风格的问题。在某些情况下,使用一种或另一种会产生重要的性能差异,因为声明性 SQL 通过优化器采用不同的代码路径。在这种特殊情况下,外连接可能不太适合优化器的探索能力(与内连接相比,用于外连接的工具更少)。
重写查询以使用不同的语法定义相同的结果可能是一种有效的调优方法,但它需要仔细注意细节并在修补或升级 SQL Server 时重新测试。通常没有理由更喜欢在 SQL 中表达需求的一种方式而不是另一种方式。
此外,正如 Andriy 在对您问题的另一个副本的评论中提到的那样,“在更一般的情况下,您的内联查询每行只会给您一个结果,同时加入 CTE(这不一定是一个CTE,它可能是一个普通的子选择)或 CROSS APPLYing 一个行集可以让你访问多个列。”
归档时间: |
|
查看次数: |
11704 次 |
最近记录: |