0

我正在编写一个存储过程,当我在执行计划/哨兵计划资源管理器中测试该过程时,我注意到在一个语句中该计划的反应很奇怪。

从我的角度来看,这里有 2 个脚本是相同的,但结果却大不相同。

脚本 1(不是真正的代码,而是演示问题的代码):

DECLARE @MyVariable INT;
SET @MyVariable = 123456789;

SELECT MT.Name, OT.Name
FROM MyTable MT
INNER JOIN OtherTable OT ON MT.ID = OT.MyTableID
WHERE OT.TypeID = @MyVariable;

脚本 2:

SELECT MT.Name, OT.Name
FROM MyTable MT
INNER JOIN OtherTable OT ON MT.ID = OT.MyTableID
WHERE OT.TypeID = 123456789;

看起来是一样的,但是我得到的结果却不一样:

  1. 脚本 1中的估计行数:15621行(肯定是错误的,行数太多)
  2. 脚本 2中的估计行数:205行(逻辑结果,可能为真)

我认为在where子句中使用变量时,SQL 执行计划的行为会有所不同。为什么?或者这里发生了什么?如何改善这一点?

谢谢

4

0 回答 0