文章目录
- 环境
- 症状
- 问题原因
- 解决方案
环境
系统平台:银河麒麟 (海光)
版本:9.0.4
症状
使用 SuperSync 将 DB2 数据同步到 HGDB 时,同步任务累计延迟约 21 天。
初步分析认为同步瓶颈可能来自磁盘 I/O,但监控系统显示:
- CPU 使用率约 5%
- 内存使用率约 5%
- 磁盘 I/O 利用率较低
系统整体资源使用正常,与同步延迟现象不符。
进一步查看数据库活动会话,发现仅有一个同步工具(dsg 用户)的 DELETE 语句持续执行。
postgres: highgo-ee-cluster: dsg xxx DELETE查看该 DELETE 进程的 I/O 使用情况:
pidstat -d -p 2353843 1输出如下:
kB_rd/s kB_wr/s iodelay 7648 23168 5 16900 28920 9 5536 35416 4 ...... 2608 83448 3 4128 71756 4 71056 1696 38可以看到:
- DELETE 进程持续产生磁盘读写;
- 写入速率最高约 83 MB/s;
- iodelay 持续大于 0,说明该进程存在磁盘 I/O 等待。
进一步分析执行语句:
deletefromtest_policymanagement.es_doc_pageswherepageidin(...);发现:
- 目标表大小约 187 GB;
- pageid 字段未建立索引;
- DELETE 每次执行均需要扫描大量数据定位待删除记录。
虽然 SQL 执行过程中真正等待磁盘 I/O 的时间占比不高,但由于全表扫描数据量巨大,导致单条 DELETE 执行时间长达十几分钟,最终造成同步任务持续积压,表现为同步延迟 21 天。
问题原因
目标表 test_policymanagement.es_doc_pages 数据量较大(约 187 GB),DELETE 语句的过滤字段 pageid 未建立索引,导致执行 DELETE 时发生全表扫描,SQL 执行效率极低,从而造成 SuperSync 同步任务持续积压。
解决方案
为 DELETE 条件字段 pageid 创建索引:
CREATEINDEXidx_es_doc_pages_pageidONtest_policymanagement.es_doc_pages(pageid);创建索引后,DELETE 语句可通过索引快速定位待删除记录,避免全表扫描,大幅降低 SQL 执行时间,SuperSync 同步效率恢复正常,同步延迟问题得到解决。