症状
假设你在 2016 年和 2017 SQL Server具有Always On可用性组 (AG) 。 在辅助副本 (replica) 上处理读取查询时,由于频繁DIRTY_PAGE_TABLE_LOCK等待,性能可能比主要副本 (replica) 慢得多。
原因
出现此问题的原因是读取查询与重做线程之间的争用,以及表已锁定。
解决方法
此修补程序包含在SQL Server的以下更新中:
SQL Server 2016 Service Pack 2 的累积更新 1
SQL Server 2016 Service Pack 1 的累积更新 9
关于SQL Server生成
SQL Server的每个新版本都包含上一版本中的所有修补程序和安全修补程序。 建议为 SQL Server 版本安装最新版本:
解决方法
若要解决此问题,可以通过启用跟踪标志 3459,使用单个重做线程而不是并行重做线程。
更多信息
当只读查询在可读的辅助副本 (replica) 上运行时,查询线程会尝试应用挂起的日志重做操作,并且需要与具有DIRTY_PAGE_TABLE_LOCK等待的重做工作线程进行协作,如果存在并发重做工作负载,这些线程会频繁生成,并降低重做和查询性能。 本文提到的 SQL Server 2016 SP 和 SQL Server 2017 累积更新版本中解决了与DIRTY_PAGE_TABLE_LOCK等待相关的性能问题。
有关详细信息,请参阅以下有关可用性组辅助副本 (replica) 重做模型和性能的博客。
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。
参考
了解 Microsoft 用于描述软件更新 的术语 。