E.22. lt_show_plans

E.22.1. 配置参数
E.22.2. 用法
E.22.3. Functions

lt_show_plans 是一个模块,用于显示所有当前正在运行的SQL语句的查询计划。 您可以选择计划的输出格式:TEXT或JSON。

当服务器启动时,lt_show_plans会在共享内存中创建一个哈希表,用于临时存储查询计划。 哈希表的大小不能更改,因此如果哈希表已满,则不会存储计划。

E.22.1. 配置参数

lt_show_plans.plan_format

它控制查询计划的输出格式。 它可以选择为textjson。默认值为text

lt_show_plans.max_plan_length

它设置查询计划的最大长度。默认值为8192 [字节]。请注意,该参数必须设置为整数。

lt_show_plans.show_level

它控制查询计划的级别。您可以选择其中之一:alltopnone。 "all"显示查询计划的所有级别。例如,当您执行由PL/pgSQL定义的函数时,将显示调用SQL语句(级别0)和函数内部的内部SQL语句(级别1)。 "top"显示查询计划的顶级别。"none"不存储查询计划,因此lt_show_plans视图不显示任何内容。默认值为none

E.22.2. 用法

在你的 lightdb.conf 中添加如下行(参见上文 lt_show_plans.show_level):

shared_preload_libraries = 'lt_show_plans'
lt_show_plans.show_level = 'top'

在启动服务器后,必须执行以下显示的 CREATE EXTENSION 语句:

testdb=# CREATE EXTENSION lt_show_plans;

执行后,您必须调用下面显示的启用函数:

    testdb=# select pg_show_plans_enable();

通过执行以下查询,可以显示当前运行的 SQL 语句的查询计划及相关信息:

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:运行查询的用户的用户 ID。

  • dbid:正在运行查询的数据库的数据库 ID。

  • plan:正在运行查询的查询计划。

如果您需要正在运行的 SQL 语句的查询计划以及相应的查询字符串,则可以执行以下查询,该查询结合了 pg_show_planspg_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 | 

E.22.3. Functions

  • pg_show_plans_disable() 禁用此功能。只有超级用户才能执行它。

  • pg_show_plans_enable() 启用此功能。只有超级用户才能执行它。