如果条件改进查询计划重用,则首选T-SQL方法

时间:2011-10-05 09:23:39

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

我想了解哪种是在存储过程中实现“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

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

提前致谢

2 个答案:

答案 0 :(得分:4)

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

Plan 1 screenshot

第二个将分支作为连接运算符的子节点。过滤器具有启动表达式谓词,这意味着只有在需要时才会评估每个搜索。

Plan 2 screenshot

答案 1 :(得分:0)

你也可以按如下方式使用它:

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

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