sql - SQL SERVER 2017 查询优化器提供一百万行估计
问题描述
我们有 SQL Server 2017,我们刚刚将兼容模式更改为 140。我们希望提高性能,但不像这么多查询需要很长时间并消耗大量服务器资源。原因似乎是新的查询优化器在实际行数为 2 时估计数百万行。
例如,通过一个小查询,QO 估计 1500 行 执行计划,但估计错误,但如果使用 OPTION (QUERYTRACEON 9481),估计是完全准确的 执行计划,估计准确
我不知道这是否是参数嗅探案例,因为如果我们更改其中一个过滤器的值,则查询是正确的。但是在兼容性程度为 110 的情况下,2 个查询可以正确执行。
我们已经完美更新了统计数据。有谁知道我应该怎么做才能解决这个问题?
已编辑** 使用 Ola Hallengren 的算法每天都会更新统计数据,其中 SQL Server 会自动计算所需的样本。但是,由于我们正在使用此查询进行测试,因此我们进行了几次全扫描。数据库统计选项有: 自动创建增量统计 False
自动创建统计 True
自动更新统计 True
异步自动更新统计 False
Legacy Cardinality Estimation OFF
Parameter Sniffing ON
Query Optimizer Fixes OFF
我刚刚尝试了 OPTION (RECOMPILE) 并且 QO 估计有 2300 行
您可以在执行计划的链接中看到实际的查询,但是是这样的:
SELECT
table1.field1
FROM table1
INNER JOIN table2 ON table1.field1 = table2.field1 AND table2.date_field=(
SELECT MAX( date_field )
FROM table2 as t2
WHERE table2.field1 = t2.field1
AND t2.date_field<=@date
)
INNER JOIN table3 ON table1.field1 = table3.field1 AND table3.date_field=(
SELECT MAX( date_field )
FROM table3 as t3
WHERE table3.field1 = t3.field1
AND t3.date_field<=@date
)
field1 是 table1 中的键,field1 和 date_field 是 table2 和 table3 中的键。这种查询在我们的系统中很常见,直到升级兼容模式才出现问题。
这些表中的数据可能每天更改一次。原始查询确实要复杂得多,估计有 3 亿行,而在上一级它没有问题。为了调查发生了什么,我从查询的最基本级别开始。
这些表最多有 85,000 条记录,密度为每个键 3 或 4 条记录。最多,在某些情况下达到 6。
更改服务器配置的步骤如下:
- 亚马逊的新 EC2 实例与 SQL Server 2017 标准版
- 我们创建兼容级别为 110 的数据库并恢复 SQL Server 2012 的数据
- 2 周后我们修改了兼容级别 140。
- 2 周后,我们启用查询存储
解决方案
推荐阅读
- jmeter - JMETER 记录包含使用 Microsoft 远程桌面协议的调用的场景并检查 3 方工具活动并返回应用程序?
- swiftui - SwiftUI 中的 GLKView?
- python - 查询以获取评分最高且至少有 5 人评分的电影
- javascript - 浏览器中不推荐使用的属性调用者
- android - 位图中的图像压缩并在android Q中上传到服务器
- javascript - 查询选择器,通过它的类和内容选择一个元素
- server - 无法将 SSL 配置为 httpd-vhosts.conf
- laravel - Laravel: 方法 ...Controller::show 不存在
- android - 如何修复 ionic 3 中的 Typescript 错误?索引.d.ts
- xcode - @Published ObservedObjects SwiftUI 更新未发生