在 CTE 或子查询中优化

Posted

技术标签:

【中文标题】在 CTE 或子查询中优化【英文标题】:Optimize For in CTE or Subquery 【发布时间】:2013-04-25 15:21:44 【问题描述】:

设置:

我正在 SQL Server 2008 R2 中试验 OPTIMIZE FOR 子句。我已将以下内容放在查询的末尾。

OPTION (OPTIMIZE FOR (@UserType= 'M', @Date UNKNOWN))

问题:

但是,我收到以下错误。

The variable "@UserType" is specified in the OPTIMIZE FOR clause, but is not used in the query.

此变量在查询中的子查询中使用,并且仅在该位置使用。

如果我尝试将OPTIMIZE FOR 移动到子查询中,则存储的过程不会编译。同样,我不能将子查询放在 CTE 中并在其中进行优化;也不编译。

Incorrect syntax near the keyword 'OPTION'.

问题:

有什么方法可以在 CTE 或子查询中使用 OPTIMIZE FOR 子句?我更喜欢使用 CTE,因为它们通常更干净、更易读。

【问题讨论】:

【参考方案1】:

option 关键字必须始终放在最外层选择查询的末尾。

例如:

declare @var int = 1;

with cte
as (
    select @var as val
)
select * from cte
option (optimize for (@var = 2))

【讨论】:

来自问题:“我已将以下内容放在查询末尾...但是,我收到以下错误。” 也许您可以发布您尝试运行的 SQL。

以上是关于在 CTE 或子查询中优化的主要内容,如果未能解决你的问题,请参考以下文章

带有子查询的 CTE 查询在小型索引表上很慢;如何在 MySQL 上进行优化?

优化sql嵌套查询,使用CTE语法

我们如何在 sql server 的子查询中使用 CTE?

没有聚合或子查询的查询

CTE 和子查询的区别?

为啥 CTE 比游标/派生表/子查询/临时表等更好?