Microsoft SQL Server 中随机疯狂的错误执行计划

Microsoft SQL Server 中随机疯狂的错误执行计划

大家好,我知道这个问题已经讨论过好几次了,但是我们现在在新的 SQL Server 2014 SP3 上面临一个非常奇怪的问题,我们无法解决。

去年我们从 Oracle 切换到 MS SQL Server。我们的主要数据库相当大,大约 800GB,大表,PDM 系统。+1000 个活跃用户。16 个核心,192 GB 内存,SSD SAN 存储。ESX 6.5

SQL Server 中的设置:-> 启用创建自动统计信息-> 针对 Ad Hoc 查询进行优化 = true-> 启用快照隔离-> 最大并行数 = 4-> 阈值 50-> TempDB 中的统计信息更新异步,通常在我们的主数据库上启用。

无论如何,我们有一些查询处理得非常糟糕。所有这些都导致 SQL Server 优化器创建了一个执行计划,认为它没问题,但在执行时,它会进行内连接(或多次连接),连接数以百万计,而不是预期的 1-2 行。当然还有数百万次逻辑读取。我无法理解其中发生了什么。这些语句当时运行了几分钟。

所以基本上,我们已经有 3 个数据库。所有版本和硬件都相同,生产测试和开发环境。我的测试可以很容易地完成。所有数据库都配置相同并显示相同的行为,但在不同的查询上。假设有时测试环境在 47 秒内多次执行相同的语句,生产数据库只需一秒钟。其他在生产中需要几秒钟,在测试中立即生效。到底发生了什么?我总是多次重试语句以确保其被缓存。

好案例

坏的情况

1s vs 47s。这两个数据库共享相同的 SQL 实例。

有什么想法可以解决这里的问题吗?如何纠正单个执行计划?为什么 SQL Server 没有从这个极其糟糕的语句中吸取教训并在下次运行时纠正它?

感谢您的帮助和想法。

相关内容