SQL Server执行计划出现‘CardinalityEstimate’不存在列的警告问题
我来帮你一步步拆解这个问题——这种警告在MERGE操作里不算少见,大概率是和语句逻辑、关联的数据库对象有关,咱们从这几个方向排查:
先仔仔细细检查你的MERGE语句
从头扫一遍你的MERGE代码,看看有没有手滑把SalesOrderID写成SalesOrderID_OLD的地方?比如WHEN MATCHED THEN UPDATE SET ...的赋值里、USING子句的关联条件里,或者ON子句的匹配逻辑中。另外也要留意表别名的使用,会不会是误写了类似soh.SalesOrderID_OLD这种错误的别名+列名组合。检查SalesOrderHeader表关联的触发器、计算列或索引视图
MERGE操作会触发表上的触发器,尤其是INSTEAD OF或AFTER类型的触发器——你右键SalesOrderHeader表,打开触发器列表,逐个查看触发器的定义,说不定触发器里引用了SalesOrderID_OLD这个不存在的列。
另外也要排查表上的计算列、索引视图,或者关联的约束(比如外键、检查约束),这些对象的逻辑里如果有错误的列名,也会在MERGE生成执行计划时触发警告。深挖执行计划的细节定位源头
把执行计划展开,找到弹出警告的那个操作符(比如Merge Join、Table Scan),右键点击它选择“属性”,在属性面板里找“谓词”“定义”这类选项,看看具体是哪个环节引用了SalesOrderID_OLD。这一步能帮你精准锁定问题出在MERGE本身,还是背后隐藏的数据库对象。尝试刷新SSMS缓存或清理计划缓存
有时候SSMS的智能感知缓存会抽风,导致错误提示。你可以按Ctrl+Shift+R刷新本地缓存,然后重新生成执行计划试试。如果是SQL Server的计划缓存有旧的无效计划残留,也可以用DBCC FREEPROCCACHE清除缓存(注意:生产环境执行前要确认影响,非必要别随便清!),再重新执行MERGE语句。检查是否有同义词/别名指向错误对象
如果你是通过同义词引用SalesOrderHeader表,那要确认同义词指向的是不是正确的表。可以用这条查询检查:SELECT * FROM sys.synonyms WHERE name = '你的同义词名称'说不定同义词误指向了一个包含
SalesOrderID_OLD列的其他表。
内容的提问来源于stack exchange,提问作者resees111

