【问题标题】:Preferred method of T-SQL if condition to improve query plan re-use提高查询计划重用的 T-SQL if 条件的首选方法
【发布时间】:2011-10-05 09:23:39
【问题描述】:

我想了解在存储过程中实现“IF”条件的更好方法。

我已经看到这种方法被广泛使用。可以和迭代编码相媲美...

declare @boolExpression bit = 1 --True

if @boolExpression  = 1
  select column from MyTable where group = 10
else
  select column from MyTable where group = 20

我更喜欢使用基于集合的方法...

declare @boolExpression bit = 1 --True

select column from MyTable where group = 10 and @boolExpression  =1
union all
select column from MYTable where group = 20 and @boolExpression =0

我更喜欢使用这种方法,因为据我了解,它创建了一个可重用的查询计划并减少了计划缓存流失。这是事实还是虚构?哪个是正确的使用方法。

提前致谢

【问题讨论】:

  • 第二个中是否缺少UNION ALL
  • 是的,谢谢 Martin,UNION ALL 不见了。我加进去

标签: sql-server tsql sql-server-2008 sql-execution-plan


【解决方案1】:

假设您缺少UNION ALL,据我所知,其中没有太多内容。第一个版本会将每个语句的计划缓存为COND 运算符的子项,以便在执行时仅调用相关的语句。

第二个将两个分支都作为连接运算符的子级。过滤器有一个启动表达式谓词,这意味着每个搜索仅在需要时进行评估。

【讨论】:

  • 位参数具有1或0值,因此为什么联盟当一个选择语句将始终返回0行? span>
  • @Adrian - 所以只返回一个结果集。而不是返回 2 个结果集 - 一个为空,一个包含数据。
  • 问题实际上是关于查询计划的重用。我的示例包括最基本的查询来说明我的请求。实际上,会出现更复杂的查询。
  • @sqlconsumer.net - 好吧,这对您的问题没有任何影响,您还没有解释您的实际情况与您所说的情况有何不同。
  • 那么这种方法会不会让存储过程查询计划的复用性更高?
【解决方案2】:

你也可以这样使用:

DECLARE @boolExpression BIT = 1

SELECT column FROM MyTable 
WHERE 
    CASE 
        WHEN @boolExpression = 1 THEN 
            CASE 
                WHEN group = 10 THEN 1 
                ELSE 0 
            END 
        ELSE 
            CASE 
                WHEN group = 20 THEN 1 
                ELSE 0 
            END 
    END = 1

我知道它看起来很复杂,但确实有用,尤其是在存储过程中应用参数是可选的情况下。

【讨论】:

  • 这是不可分割的,并且会进行扫描而不是搜索。
  • @Martin Smith:感谢您的评论,我同意这将是一次扫描。只是想在 WHERE 子句中描述条件操作的另一种方式,因为它更容易维护更改,直到和除非性能成为一个真正的问题,这将根据实际需要/要求进行更改;问题中并不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2023-03-30
相关资源
最近更新 更多