我知道使用通用存储过程进行代码重用的诱惑可能是一个陷阱,但我不知道这种参数化查询的方法是否只有一个恒定的性能成本。
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
语句可能真的会破坏编译存储过程的好处。这些短路机制是否具有相同的效果,即使它们看起来更“基于集合”?