更新时间:2024-11-12 GMT+08:00
分享

长查询执行期间大量并发更新偶现写入性能下降

问题现象

执行全表扫描类型的长查询,扫描期间页面发生大量并发更新,部分DML写入性能较没有长查询时出现性能下降。

问题分析

对于全表扫描场景下的长查询(例如持续两小时以上),在扫描到某个页面前,该页面发生大量集中并发更新(例如十万次以上更新),后续扫描到该页面时,需要访问大量历史版本获取可见元组(MVCC机制),由于单页扫描期间持有页面读锁,若此时刚好需要写入该页面,写入会被阻塞,直到页面元组读取完成。

定位手段

  1. 结合慢SQL告警、statement_history视图等确认是否存在长查询和超时取消的DML语句。
  2. 获取1statement_history中查询到的被取消DML的details信息,使用statement_detail_decode系统函数解析details字段,获取等待事件,如等待事件开销占比最高为BufferContentLock则大概率为本问题。

处理方法

事前预防:避免在高并发表上执行全表扫描类型长查询,建议长查询迁移到备机执行。

事中处理:结合慢SQL告警等确认是否触发此场景,可通过中断长查询避免对业务的持续影响。

相关文档