我使用备份还原技术和一组传输后操作(如DBCC UPDATEUSAGE
or )将数据库从 SQL Server 2008R2 迁移到 SQL Server 2019(企业版) UPDATE STATISTICS XXX
。
在统计更新时,我收到以下错误:
Msg 402, Level 16, State 1, Procedure ZZZZ, Line 5 [Batch Start Line 0]
The data types datetime and time are incompatible in the add operator.
Msg 4413, Level 16, State 1, Line 1
Could not use view or function 'ZZZZ' because of binding errors.
我知道该消息非常明确(在 2008R2 上语法正确的视图在 2019 年不再存在)。我不明白为什么定义WITH SCHEMABINDING
的无效视图会阻止更新基础表上的统计信息。
此外,在使用子句查询基础表时,我会收到相同的错误消息WHERE
,除非我使用以下提示强制 FULLSCAN:
OPTION(TABLE HINT( $mytable, FORCESCAN ))
我知道如果对底层架构绑定对象进行 DDL 更改,SQL Server 会触发错误,但我不明白为什么,如果视图无效,则底层对象不能像往常一样使用。
我确定有一个解释(例如由于视图无效而无法处理模式绑定视图的保护机制),但我无法在文档中确定。
我跑了一个DBCC CHECKDB
没有问题的。我将兼容级别更改为150。
从文档中:
当您的数据库中有无效的索引视图时,当优化器考虑使用索引视图而不是基表访问时,此企业版功能可能会产生错误。
可以使用
EXPAND VIEWS
查询提示禁用此自动索引视图匹配功能:升级数据库时,会发出警告:
这很容易错过,在某些情况下甚至可能对用户不可见。尽管如此,教训还是很清楚的:包含无效对象的数据库可能会产生意外错误。
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
也会发现问题。如果您需要在 SQL Server 2019 上运行数据库,请使用数据库兼容性级别 100,直到您能够解决升级问题。这将允许使用加法运算符将日期时间添加到时间。
关于查询基础表时,优化器可能会生成一个使用视图索引而不是表的计划?
执行计划应该会告诉你,或者试试 EXPAND VIEWS 提示。