长查询执行期间大量并发更新偶现写入性能下降
问题现象
执行全表扫描类型的长查询,扫描期间页面发生大量并发更新,部分DML写入性能较没有长查询时出现性能下降。
问题分析
对于全表扫描场景下的长查询(例如持续两小时以上),在扫描到某个页面前,该页面发生大量集中并发更新(例如十万次以上更新),后续扫描到该页面时,需要访问大量历史版本获取可见元组(MVCC机制),由于单页扫描期间持有页面读锁,若此时刚好需要写入该页面,写入会被阻塞,直到页面元组读取完成。
定位手段
- 结合慢SQL告警、statement_history视图等确认是否存在长查询和超时取消的DML语句。
- 获取1statement_history中查询到的被取消DML的details信息,使用statement_detail_decode系统函数解析details字段,获取等待事件,如等待事件开销占比最高为BufferContentLock则大概率为本问题。
处理方法
事前预防:避免在高并发表上执行全表扫描类型长查询,建议长查询迁移到备机执行。
事中处理:结合慢SQL告警等确认是否触发此场景,可通过中断长查询避免对业务的持续影响。