我正在编写一个存储过程,当我在执行计划/哨兵计划资源管理器中测试该过程时,我注意到在一个语句中该计划的反应很奇怪。
从我的角度来看,这里有 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中的估计行数:15621行(肯定是错误的,行数太多)
- 脚本 2中的估计行数:205行(逻辑结果,可能为真)
我认为在where
子句中使用变量时,SQL 执行计划的行为会有所不同。为什么?或者这里发生了什么?如何改善这一点?
谢谢