症状
请考虑以下情况:
-
在 Microsoft SQL Server 2016 中使用兼容级别设置为 130 的数据库。
-
执行访问列存储索引和行存储索引或堆的查询,并包含筛选器谓词 (WHERE 子句) 。
在此方案中,SQL Server无法将筛选器谓词推送到更靠近数据源运算符 (表或索引扫描或查找) 。 这可能会导致查询性能不佳。
此外,如果查询使用表达式 ((例如类型转换) 其正确性取决于筛选的数据 (例如),则 char 表列将转换为 int,但只有一部分值包含有效的 int 表示形式,并且此子集由筛选器谓词) 标识,则查询可能会失败,并出现类似于以下内容之一的数据转换错误:
将 varchar 值“0.5”转换为数据类型 int 时,消息 245、级别 16、状态 1、第 20
行转换失败。 消息 8114,级别 16,状态 5,第 34 行将数据类型 varchar 转换为 bigint 时出错。解决方法
以下针对 SQL Server 的累积更新中修复了此问题:适用于 SQL Server 2016 SP1 的累积更新 2
备注 必须启用查询优化器修补程序才能使此修复生效。
可以使用以下选项之一启用查询优化器修补程序:跟踪标志 4199、数据库作用域配置设置QUERY_OPTIMIZER_HOTFIXES=ON (在 SQL Server 2016 及更高版本) 中可用,或者USE_HINT查询选项“ENABLE_QUERY_OPTIMIZER_HOTFIXES” (SQL Server 2016 SP1 及更高版本) 。
SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看SQL Server的最新累积更新:2016 SQL Server 的最新累积更新
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。
参考
了解 Microsoft 用于描述软件更新 的术语。