openGauss 有一个慢 SQL 诊断特性,数据库会依据配置自动记录慢 SQL 执行过程中的诊断信息,提供表与函数两种查询接口。

相关 GUC 参数

  • log_min_duration_statement:慢 SQL 执行时间阈值。

    超过该时间的语句会被识别为慢 SQL 并依据配置记录诊断信息。

  • track_stmt_stat_level:语句诊断信息的记录级别。

    可为普通语句与慢 SQL 分别配置,用逗号分隔。 默认值为 OFF,L0,表示不记录普通语句,以 L0 级别记录慢 SQL 语句的诊断信息。

查询诊断信息示例

首先建表,插入足够多的数据:

CREATE TABLE t (v integer);
INSERT INTO t VALUES (generate_series(1, 1E6));

可以打开计时功能,输出每条 SQL 的执行时间:

\timing on

默认的慢 SQL 阈值是 30 分钟,太久了,所以我们简单降低一下:

SET log_min_duration_statement TO '100ms';

于是对之前的表做全表扫描输出,因为结果比较多,可以将输出重定向到 /dev/null

\o /dev/null
SELECT * from t;
\o

由于诊断信息的字段很多,一般是先给 gsql 开启 expanded 输出模式:

\pset expanded on

查询所有诊断信息:

SELECT * FROM statement_history;

介绍一些常用字段:

  • query:经过脱敏处理的原始语句
  • start_time:执行开始时间
  • finish_time:执行结束时间
  • query_plan:执行计划
  • n_returned_rows:返回行数

清除诊断信息:

DELETE FROM statement_history;