pg_show_plans 是 LightDB 用于查看当前执行语句执行状态的工具,以便用户可以实时监视执行计划。pg_show_plans 可以以 TEXT 或 JSON 的格式展示执行状态。
pg_show_plans 内部将查询信息信息有效地存储在共享内存中,以便更方便更快速的查询/过滤这些信息 。
LightDB 通过修改原有的的处理逻辑,可避免在高并发情况下(特别是客户端数量庞大时)引起的性能急剧下降的问题。
Configuration Parameters
- pg_show_plans.plan_format:控制查询计划的输出格式,可以是 text(默认) 或 json;
- pg_show_plans.max_plan_length:控制查询计划的最大长度。默认为 8192(字节);
- pg_show_plans.show_level:控制查询计划的级别,all 表示显示全部级别的查询计划,top 表示显示最顶层的查询计划的,none 表示不工作(即不存储执行计划);
Usage
在 postgresql.conf 中添加:
shared_preload_libraries = 'pg_show_plans'
pg_show_plans.show_level = 'top'
启动服务器前,需确保执行如下语句:
testdb=# CREATE EXTENSION pg_show_plans;
执行如下语句,即可查询执行状态:
testdb=# SELECT * FROM pg_show_plans;
pid | level | userid | dbid | plan
-------+-------+--------+-------+-----------------------------------------------------------------------
11473 | 0 | 10 | 16384 | Function Scan on pg_show_plans (cost=0.00..10.00 rows=1000 width=56)
11504 | 0 | 10 | 16384 | Function Scan on print_item (cost=0.25..10.25 rows=1000 width=524)
11504 | 1 | 10 | 16384 | Result (cost=0.00..0.01 rows=1 width=4)
(3 rows)
注意:pg_show_plans 是视图:
- pid:运行该查询的进程 pid;
- level:运行该查询的级别,最高级别为 0;
- userid:运行该查询的用户的用户名;
- dbid:运行该查询的数据库的 id;
- plan:运行中的查询计划;
如果你需要运行中的 SQL 语句的查询计划和相应的查询字符串,可以执行以下查询(关联 pg_stat_activity 表):
testdb=# \x
Expanded display is on.
testdb=# SELECT p.pid, p.level, p.plan, a.query FROM pg_show_plans p
LEFT JOIN pg_stat_activity a
ON p.pid = a.pid AND p.level = 0 ORDER BY p.pid, p.level;
-[ RECORD 1 ]-----------------------------------------------------------------------------------------
pid | 11473
level | 0
plan | Sort (cost=72.08..74.58 rows=1000 width=80) +
| Sort Key: pg_show_plans.pid, pg_show_plans.level +
| -> Hash Left Join (cost=2.25..22.25 rows=1000 width=80) +
| Hash Cond: (pg_show_plans.pid = s.pid) +
| Join Filter: (pg_show_plans.level = 0) +
| -> Function Scan on pg_show_plans (cost=0.00..10.00 rows=1000 width=48) +
| -> Hash (cost=1.00..1.00 rows=100 width=44) +
| -> Function Scan on pg_stat_get_activity s (cost=0.00..1.00 rows=100 width=44)
query | SELECT p.pid, p.level, p.plan, a.query FROM pg_show_plans p +
| LEFT JOIN pg_stat_activity a +
| ON p.pid = a.pid AND p.level = 0 ORDER BY p.pid, p.level;
-[ RECORD 2 ]-----------------------------------------------------------------------------------------
pid | 11517
level | 0
plan | Function Scan on print_item (cost=0.25..10.25 rows=1000 width=524)
query | SELECT * FROM print_item(1,20);
-[ RECORD 3 ]-----------------------------------------------------------------------------------------
pid | 11517
level | 1
plan | Result (cost=0.00..0.01 rows=1 width=4)
query |