目前,我有一个程序可以在以下位置执行 4 个操作Transaction
:
- 更新表中的记录
A
- 更新表中的记录
B
- 向表中插入记录
C
- 从表中删除记录
D
@IsUpdateA
只有当procedure ( ) 的一个参数等于1时,才执行第一个操作。
因此,从业务角度来看,如果@IsUpdateA
= 1,则必须执行表 A 的更新,而始终执行第 2、3 和 4 步。
问题是将这样的程序分成两部分是否更好(就效率/执行计划而言),即
- 第一个程序将始终执行步骤 1、2、3、4
- 第二个程序将始终执行步骤 2,3,4
并将@IsUpdateA
在应用程序中进行检查。我不能在程序中使用程序(内部要求)。
无论您的程序逻辑如何,优化器都会使用嗅探到的参数值。想象一下您的 proc 代码中只有 DML 语句和参数。
因此,当生成计划时,当@IsUpdateA = 0 时,要用于UPDATE 的值可能是无意义的值。从性能的角度来看,就是这样。想想 WHERE 子句和选择性。即,为那个 UPDATE(未执行)创建的计划是基于给你不正确的选择性计算的值,因此是一个糟糕的计划。
或者反过来,当然。
即,拥有两个 proc 可以为您提供更好的估计,并最终为您提供更好的计划。