MSSQL 2012导致AG延迟的原因
鹰舞(Q2):MSSQL 2012的alwayson技术已经在线上使用了,但是发现在辅助副本上经常会出现AG延迟的情况,检查是因为辅助副本中的业务长时间查询导致了AG进程的还原block,锁是意向架构锁,请问下这个是什么原因导致呢?有什么办法可以避免此问题?
石沫(A2):您好,根据您的描述,由于查询产生了副本REDO LOG延迟,出现了架构锁。我们知道SQL SERVER 2012 AlwaysOn在某些数据库行为上有较多变化。我们先看看架构锁:
架构锁分成两类:
1. SCH-M:架构更改锁,主要发生在数据库SCHEMA的修改上,从你的描述看,没有更改SCHEMA,那么可以排除这个因素
2. SCH-S:架构稳定锁,主要发生在数据库的查询编译等活动
根据你的情况,应该属于SCH-S导致的。查询编译活动主要发生有新增加了INDEX, 更新了统计信息,未参数化的SQL语句等等
对于INDEX和SQL语句方面应,我想应该不会有太多问题。
我们重点关注一下统计信息:SQL SERVER 2012 AG副本的统计信息维护有两种:
1. 主体下发到副本
2. 临时统计信息存储在TEMPDB
对于主体下发的,我们可以设置统计信息的更新行为,自动更新时,可以设置为异步的(自动更新统计信息必须首先打开):
USE [master]
GO
ALTER DATABASE [Test_01]
SET AUTO_UPDATE_STATISTICS_ASYNC ON
WITH NO_WAIT
GO
这样的话查询优化器不等待统计信息更新完成即编译查询。可以优化一下你的BLOCK。
对于临时统计信息存储在TEMPDB里面也是很重要的,再加上ALWAYSON的副本数据库默认是快照隔离,优化TEMPDB也是必要的,关于优化TEPDB这个我想大部分都知道,这里只是提醒一下。
除了从统计信息本身来解决,在查询过程中,可以降低查询的时间,以尽量减少LOCK的时间和范围,这需要优化你的SQL语句或者应用程序。
以上,希望对您有所帮助。谢谢!