KB4163087 - 修复:在 SQL Server 中处理读取查询时,Always On AG 的性能会降低

应用对象
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 on Windows (all editions)

症状

假设你在 2016 SQL Server 和 2017 中有一个 Always On 可用性组 (AG) 。 在辅助副本 (replica) 上处理读取查询时,由于频繁的DIRTY_PAGE_TABLE_LOCK等待,性能可能比主副本 (replica) 慢得多。

原因

出现此问题的原因是读取查询和重做线程之间存在争用,并且表已锁定。

解决方法

此修补程序包含在 SQL Server 的以下更新中:

SQL Server 2017 累积更新 8

SQL Server 2016 Service Pack 2 的累积更新 1

SQL Server 2016 Service Pack 1 累积更新 9

关于 SQL Server 内部版本

SQL Server 的每个新内部版本都包含先前内部版本中的所有修补程序和安全修补程序。 我们建议您安装 SQL Server 的最新版本:

SQL Server 2017 的最新累计更新

SQL Server 2016 的最新版本

解决方法

若要解决此问题,可以通过启用跟踪标志 3459 来使用单个重做线程,而不是并行重做线程。

详细信息

当只读查询在可读的辅助副本 (replica) 上运行时,查询线程会尝试应用挂起的日志重做操作,并且需要与具有DIRTY_PAGE_TABLE_LOCK等待的重做工作线程协作,这可能会频繁生成,如果并发有重做工作负载,则会降低重做和查询性能。 本文提到的 SQL Server 2016 SP 和 SQL Server 2017 的累积更新版本解决了与DIRTY_PAGE_TABLE_LOCK等待相关的性能问题。

有关详细信息,可以参阅以下关于可用性组次要副本 (replica) 重做模型和性能的博客。

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

参考资料

了解 Microsoft 用于描述软件更新的 术语 。