LEE JOIN B ON @IncludeBJoin = 1 AND B.AID = A.ID WHERE @IncludeBJoin = 0或B.ID IS NOT NULL

时间:2011-09-30 10:43:34

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

我知道使用通用存储过程进行代码重用的诱惑可能是一个陷阱,但我不知道这种参数化查询的方法是否只有一个恒定的性能成本。

SELECT
    ...
FROM
    A
LEFT JOIN 
    B ON 
    @IncludeBJoin = 1 AND
    B.AID = A.ID 
WHERE 
    @IncludeBJoin = 0 
    OR B.ID IS NOT NULL -- If included, only include INNER JOIN results

以上的目的是当仅需要来自A的结果时,有条件地将不必要的连接短路到B。这是一个简单的例子,但实际案例中会有许多这样的可选连接。如果值得花费性能,我希望避免每种组合的不同存储过程。

然后,这个扩展怎么样?

SELECT
    ...
FROM
    A
LEFT JOIN 
    B ON 
    @IncludeBJoin = 1 AND
    B.AID = A.ID 
WHERE 
    @IncludeBJoin = 0 
    OR B.ID IS NOT NULL
GROUP BY A... WITH ROLLUP                             -- Extension
HAVING (@AggregatesOnly = 0) OR (GROUPING(A...) = 1)  -- Extension

上述目的是始终返回汇总的聚合,并可选择包含组件行。如果@AggregatesOnly = 1,这样我只想要分组,我会支付什么性能价格?

执行计划对我来说似乎有些神奇,因为它们的表示在概念上似乎远离原始语句定义,并且SQL执行引擎的内部工作没有很好地公开记录AFAIK。我已经读过程序逻辑,例如在存储过程中使用IF语句可能真的会破坏编译存储过程的好处。这些短路机制是否具有相同的效果,即使它们看起来更“基于集合”?

0 个答案:

没有答案