openGauss 中负责慢 SQL 记录的线程有两个角色协同工作:
- Statement Flush Thread(TRACK_STMT_WORKER)
-
入口函数: StatementFlushMain()(instr_statement.cpp:997)
-
主循环: StatementFlush()(instr_statement.cpp:960)
-
作用: 这是一个常驻后台线程,周期性地将各会话中积累的慢 SQL 全量信息刷入 statement_history 表或 standby 上的 MemFileChain。
-
清理触发: 每轮 flush 前调用 StartCleanWorker(&count)(第 981 行),当连续计数达到 600 次(即约 1 分钟,maxCleanInterval = 600)时,向 postmaster 发送
PMSIGNAL_START_CLEAN_STATEMENT 信号,由 postmaster 启动一个一次性 Clean 线程。
cpp
// instr_statement.cpp:751-774
static void StartCleanWorker(int* count)
{
int maxCleanInterval = 600; // 600 * 100ms = 1min
...
if (g_instance.stat_cxt.instr_stmt_is_cleaning) {
return;
}
SendPostmasterSignal(PMSIGNAL_START_CLEAN_STATEMENT);
...
}
- Clean Statement Thread(TRACK_STMT_CLEANER)
-
入口函数: CleanStatementMain()(instr_statement.cpp:1076)
-
实际清理逻辑: CleanStatementTable()(instr_statement.cpp:783)
-
清理实现: CleanStatementByIdx()(instr_statement.cpp:730)------根据slow_sql_retention_time(慢 SQL 保留天数)和 full_sql_retention_time(全量 SQL
保留秒数),按时间范围扫描并 simple_heap_delete 过期记录。
- 特点: 这是一个一次性进程,执行完清理后直接 proc_exit(0) 退出。
关键 GUC 参数
| 参数 | 说明 |
|---|---|
| track_stmt_retention_time | 控制保留时间,格式 "full_sql秒,slow_sql天" |
| track_stmt_stat_level | 控制追踪级别(OFF/L0/L1/L2) |
总结流程
总结流程
- TRACK_STMT_WORKER (常驻后台线程)
- └─ StatementFlush() 每 100ms 执行一次循环
- ├─ 收集各 session 的慢 SQL → 刷入 statement_history 表
- └─ 每 600 轮(约 1 分钟)触发一次清理
- └─ 发送 PMSIGNAL_START_CLEAN_STATEMENT 信号
- └─ Postmaster 启动 TRACK_STMT_CLEANER(一次性线程)
- └─ 执行 CleanStatementTable() 删除过期记录
- └─ 清理完成,线程退出