文档

ANALYZE分析工具

更新时间:

本文介绍了的ANALYZE分析工具。

背景信息

在PostgreSQL中,分析SQL语句性能时一般会使用EXPLAIN ANALYZE工具。它能够输出查询计划在执行过程中的具体耗时、资源消耗等信息,可用于排查SQL的性能瓶颈。

但是该命令只适用于单机执行的SQL性能分析。对于ePQ并行查询计划来说,EXPLAIN ANALYZE并不能统计出各个节点的执行耗时和资源消耗信息。因此,扩展了现有的EXPLAIN ANALYZE工具,使其能够统计并行查询计划在各个节点上的执行时间、数据扫描量、内存使用等信息,并以统一的视角提供给用户。

前提条件

支持的的版本如下:

  • PostgreSQL 11(内核小版本1.1.22及以上)

  • PostgreSQL 14(内核小版本14.6.6.0及以上)

说明

您可通过如下语句查看的内核小版本的版本号:

  • PostgreSQL 11

    show polar_version;
  • PostgreSQL 14

    select version();

术语

  • QC:Query Coordinator,发起ePQ并行查询的进程角色。

  • PX Worker:参与ePQ跨节点并行查询的工作进程角色。

  • Worker ID:唯一标识一个PX Worker的编号。

原理介绍

在ePQ优化器产生的分布式并行查询计划中,计划树中的每个算子可能被多个PX Worker执行。例如,一个Seq Scan计划节点会被多个PX Worker执行,每个PX Worker负责扫描一部分数据。因此,相比于现有的EXPLAIN ANALYZE工具,PX的EXPLAIN ANALYZE工具需要收集每个PX Worker的执行状态。

交互流程

每个PX Worker和QC之间采用libpq的 'Y'协议进行通信:

  1. QC将EXPLAIN ANALYZE命令下发给PX Worker。

  2. 各个PX Worker统计本地的资源使用、执行耗时等信息。

  3. 各个PX Worker在本地计划执行完毕后,将上述信息发送给QC。

  4. QC等待所有PX Worker全部完成各自计划的执行后,进行统计计算并输出。

统计内容与形式

  • 兼容现有EXPLAIN ANALYZE的功能和语法,输出每个算子的执行状态,具体包括以下内容:

    • 算子执行时间,目前取该算子下所有PX Worker的最大执行时间。

    • 算子扫描的总行数,目前取该算子下所有PX Worker所扫描行数的累加和。

    • 算子执行次数(循环),目前取该算子下所有PX Worker的循环次数累加和。

    • 算子的buffer、内存等资源使用信息,目前取该算子下所有PX Worker的资源使用量累加和。

  • 统计每个PX Worker的执行状态:例如,Seq Scan算子会被4个PX Worker执行,需要输出每个PX Worker的信息,可以用于判断查询计划是否存在倾斜的情况。具体信息包括:

    • 每个PX Worker的内存使用情况。

    • 每个PX Worker的执行时间。

    • 每个PX Worker的处理行数。

image

使用指南

参数说明

ePQ的EXPLAIN ANALYZE依赖以下三个参数:

参数名称

说明

polar_enable_px

是否开启并行查询功能。取值如下:

  • ON:开启。

  • OFF:关闭(默认)。

polar_px_enable_explain_allstat

是否打印每个PX Worker的详细信息。取值如下:

  • ON:开启。

  • OFF:关闭(默认)。

polar_px_explain_memory_verbosity

打印每个算子的内存使用情况,以及使用最多内存的PX Worker。取值如下:

  • summary(默认):为整个查询计划输出一个汇总性的内存使用情况。

  • detail:为查询计划的每个计划节点输出详细的内存使用情况。

其中:

  • 开启polar_px_enable_explain_allstat参数后,具体输出信息如下:

    • worker:执行进程编号。

    • first_time:执行的开始时间,单位为毫秒(ms)。

    • total_time:执行的结束时间,单位为毫秒(ms)。

    • total_num:该worker处理的数据量,可用于判断是否存在任务倾斜。

  • 开启polar_px_explain_memory_verbosity参数后,输出的信息如下:

    • Executor Memory:所有PX Worker使用的总内存量。

    • Workers:PX Worker的数量,即并行度。

    • Max:使用内存量最大的一个PX Worker。

具体开启方式如下所示:

SET polar_enable_px = ON;
SET polar_px_enable_explain_all_stat = ON;
SET polar_px_explain_memory_verbosity = detail;

示例

  1. 创建示例表。

    CREATE TABLE px_analyze_t1 (a int, b int, c varchar(20));
  2. 插入数据。

    INSERT INTO px_analyze_t1
    SELECT i, i*2, to_char(i, 'FM00000')
    FROM generate_series(1, 100000) i;
  3. 修改PX的EXPLAIN ANALYZE依赖参数。

    SET polar_enable_px = ON;
    SET polar_px_enable_explain_all_stat = ON;
    SET polar_px_explain_memory_verbosity = detail;
  4. 执行查询命令。

    EXPLAIN ANALYZE SELECT * FROM px_analyze_t1;
  5. 查看执行信息。

                                                             QUERY PLAN
    --------------------------------------------------------------------------------------------------------------------------------
     PX Coordinator 6:1  (slice1; segments: 6)  (cost=0.00..431.00 rows=1 width=28) (actual time=1.489..68.326 rows=100000 loops=1)
       Executor Memory: 7kB  Workers: 1  Max: 7kB (worker -1)
       ->  Partial Seq Scan on px_analyze_t1  (cost=0.00..431.00 rows=1 width=28) (actual time=0.687..33.141 rows=94720 loops=1)
             Executor Memory: 63kB  Workers: 6  Max: 11kB (worker 0)
             allstat:
                 worker:0, first_time:13(ms), total_time:33(ms), total_num:94720
                 worker:1, first_time:13(ms), total_time:2.366(ms), total_num:5280
                 worker:2, first_time:13(ms), total_time:0.675(ms), total_num:0
                 worker:3, first_time:13(ms), total_time:0.691(ms), total_num:0
                 worker:4, first_time:13(ms), total_time:0.694(ms), total_num:0
                 worker:5, first_time:13(ms), total_time:0.707(ms), total_num:0
             Dynamic Pages Per Worker: [512,29]
     Planning Time: 11.554 ms
     Optimizer: PolarDB PX Optimizer
       (slice0)    Executor memory: 36K bytes.
       (slice1)    Executor memory: 24K bytes avg x 6 workers, 27K bytes max (seg0).
     Execution Time: 85.323 ms
    (17 rows)
    • 执行期间的内存占用情况:Executor Memory: 63 KB Workers: 6 Max: 11 KB (worker 0)表示一共使用了6 KB内存,共有6个PX Worker执行这个计划,其中编号为0的PX Worker使用的内存量最大(11 KB)。

    • allstat输出每个PX Worker的具体执行情况:worker:0, first_time:13(ms), total_time:33(ms), total_num:94720表示编号为0的PX Worker处理第一条记录的时间为13 ms,一共耗时33 ms,处理的行数为94720行。

  • 本页导读
文档反馈