GaussDB-EXPLAIN

59 阅读6分钟

GaussDB-EXPLAIN

功能描述

显示SQL语句的执行计划。

执行计划将显示SQL语句所引用的表会采用什么样的扫描方式,如:简单的顺序扫描、索引扫描等。如果引用了多个表,执行计划还会显示用到的JOIN算法。

执行计划的最关键的部分是语句的预计执行开销,这是计划生成器估算执行该语句将花费多长的时间。

若指定了ANALYZE选项,则该语句会被执行,然后根据实际的运行结果显示统计数据,包括每个计划节点内时间总开销(毫秒为单位)和实际返回的总行数。这对于判断计划生成器的估计值是否接近实际值非常有用。

注意事项

在指定ANALYZE选项时,语句会被执行。如果用户想使用EXPLAIN分析INSERT,UPDATE,DELETE,CREATE TABLE AS或EXECUTE语句,而不想改动数据(执行这些语句会影响数据),请使用如下方法。

| ``` START TRANSACTION; EXPLAIN ANALYZE ...; ROLLBACK;

| ---------------------------------------------------------- |

#### 语法格式

-   显示SQL语句的执行计划,支持多种选项,对选项顺序无要求。

    | ```
    EXPLAIN [ ( option [, ...] ) ] statement; 
    ``` |
    | -------------------------------------------------- |

    其中选项option子句的语法为。

    | ```
    ANALYZE [ boolean ] |     ANALYSE [ boolean ] |     VERBOSE [ boolean ] |     COSTS [ boolean ] |     CPU [ boolean ] |     DETAIL [ boolean ] |     NODES [ boolean ] |     NUM_NODES [ boolean ] |     BUFFERS [ boolean ] |     TIMING [ boolean ] |     PLAN [ boolean ] |     BLOCKNAME [ boolean ] |     FORMAT { TEXT | XML | JSON | YAML } 
    ``` |
    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   显示SQL语句的执行计划,且要按顺序给出选项。

    | ```
    EXPLAIN { [ ANALYZE | ANALYSE ] [ VERBOSE ] | PERFORMANCE } statement; 
    ``` |
    | ------------------------------------------------------------------------------- |

#### 参数说明

-   **statement**

    指定要分析的SQL语句。

-   **ANALYZE boolean | ANALYSE boolean**

    显示实际运行时间和其他统计数据。当两个参数同时使用时,在option中排在后面的一个生效。

    取值范围:

    -   TRUE(缺省值):显示实际运行时间和其他统计数据。
    -   FALSE:不显示。

-   **VERBOSE boolean**

    显示有关计划的额外信息。

    取值范围:

    -   TRUE(缺省值):显示额外信息。
    -   FALSE:不显示。

-   **COSTS boolean**

    包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。

    取值范围:

    -   TRUE(缺省值):显示估计总成本和宽度。
    -   FALSE:不显示。

-   **CPU boolean**

    打印CPU的使用情况的信息。需要结合ANALYZE或ANALYSE选项一起使用。

    取值范围:

    -   TRUE(缺省值):显示CPU的使用情况。
    -   FALSE:不显示。

-   **DETAIL boolean**

    打印DN上的信息。需要结合ANALYZE或ANALYSE选项一起使用。

    取值范围:

    -   TRUE(缺省值):打印DN的信息。
    -   FALSE:不打印。

-   **NODES boolean**

    打印query执行的节点信息。

    取值范围:

    -   TRUE(缺省值):打印执行的节点的信息。
    -   FALSE:不打印。

-   **NUM_NODES boolean**

    打印执行中的节点的个数信息。

    取值范围:

    -   TRUE(缺省值):打印DN个数的信息。
    -   FALSE:不打印。

-   **BUFFERS boolean**

    包括缓冲区的使用情况的信息。需要结合ANALYZE或ANALYSE选项一起使用。

    取值范围:

    -   TRUE:显示缓冲区的使用情况。
    -   FALSE(缺省值):不显示。

-   **TIMING boolean**

    包括实际的启动时间和花费在输出节点上的时间信息。需要结合ANALYZE或ANALYSE选项一起使用。

    取值范围:

    -   TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。
    -   FALSE:不显示。

-   **PLAN** **boolean**

    是否将执行计划存储在plan_table中。当该选项开启时,会将执行计划存储在plan_table中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。

    取值范围:

    -   TRUE(缺省值):将执行计划存储在plan_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUCCESS。
    -   FALSE:不存储执行计划,将执行计划打印到当前屏幕。

-   **BLOCKNAME** **boolean**

    是否显示计划的每个操作所处于的查询块。当该选项开启时,会将每个操作所处于的查询块的名字输出在Query Block列上,方便用户获取查询块名字,并使用Hint修改执行计划:

    -   TRUE(缺省值):显示计划时,将每个操作所处于的查询块的名字输出在新增列Query Block列上。该选项需要在pretty模式下使用。见[指定Hint所处的查询块Queryblock](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0272.html#ZH-CN_TOPIC_0000001911585745)章节。
    -   FALSE:不对计划显示产生影响。

-   **FORMAT**

    指定输出格式。

    取值范围:TEXT,XML,JSON和YAML。

    默认值:TEXT。

-   **PERFORMANCE**

    使用此选项时,即打印执行中的所有相关信息。下述为部分信息描述:

    -   ex c/r:代表平均每行使用cpu周期数,等于(ex cyc)/(ex row)。
    -   ex row:执行行数。
    -   ex cyc:代表使用的cpu周期数。
    -   inc cyc:代表包含子节点使用的总cpu周期数。
    -   shared hit:代表算子的share buffer命中情况。
    -   loops:算子循环执行次数。
    -   total_calls:生成元素总数。
    -   remote query poll time stream gather:算子用于侦听各DN数据到达CN的网络poll时间。
    -   deserialize time:反序列化所需时间。
    -   estimated time:估计时间。
    -   Network Poll Time:分布式stream网络通信时,表示libcomm接收侧等待数据耗时。
    -   Stream Send time:分布式stream网络通信时,表示libcomm或libpq发送数据耗时。
    -   OS Kernel Send time:分布式stream网络通信时,表示操作系统层发送数据耗时,大于0才会显示。
    -   Wait Quota time:分布式stream网络通信时,表示libcomm等待对端发送quota流控大小耗时,大于0才会显示。
    -   Data Serialize time:分布式stream网络通信时,表示数据序列化时间 。
    -   Data Copy time:分布式stream网络通信时,表示数据复制时间,大于0才会显示。

#### 示例

| ```
--创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds;  --创建表tpcds.customer_address。 gaussdb=# CREATE TABLE tpcds.customer_address ( ca_address_sk         INTEGER           NOT NULL, ca_address_id         CHARACTER(16)     NOT NULL );   --向表中插入多条记录。 gaussdb=# INSERT INTO tpcds.customer_address VALUES (5000, 'AAAAAAAABAAAAAAA'),(10000, 'AAAAAAAACAAAAAAA');  --创建一个表tpcds.customer_address_p1。 gaussdb=# CREATE TABLE tpcds.customer_address_p1 AS TABLE tpcds.customer_address;  --修改explain_perf_mode为normal。 gaussdb=# SET explain_perf_mode=normal;  --显示表简单查询的执行计划。 gaussdb=# EXPLAIN SELECT * FROM tpcds.customer_address_p1; QUERY PLAN -------------------------------------------------- Data Node Scan  (cost=0.00..0.00 rows=0 width=0) Node/s: All datanodes (2 rows)  --使用ANALYZE选项,在输出中增加运行时间统计。 gaussdb=# EXPLAIN ANALYZE SELECT * FROM tpcds.customer_address_p1;                                          QUERY PLAN                                          --------------------------------------------------------------------------------------------  Data Node Scan  (cost=0.00..0.00 rows=0 width=0) (actual time=1.754..3.218 rows=2 loops=1)    Node/s: All datanodes  Total runtime: 3.272 ms (3 rows)  --使用ANALYZE选项和CPU选项,输出CPU的使用信息。 gaussdb=# EXPLAIN (ANALYZE,CPU)SELECT * FROM tpcds.customer_address_p1;                                             QUERY PLAN                                             --------------------------------------------------------------------------------------------------  Data Node Scan  (cost=0.00..0.00 rows=0 width=0) (actual time=1.996..2.214 rows=2 loops=1)    Node/s: All datanodes    (CPU: ex c/r=25694795469106248, ex row=2, ex cyc=51389590938212496, inc cyc=51389590938212496)  Total runtime: 2.251 ms (4 rows)  --以JSON格式输出的执行计划(explain_perf_mode为normal时)。 gaussdb=# EXPLAIN(FORMAT JSON) SELECT * FROM tpcds.customer_address_p1;               QUERY PLAN               --------------------------------------  [                                   +    {                                 +      "Plan": {                       +        "Node Type": "Data Node Scan",+        "Startup Cost": 0.00,         +        "Total Cost": 0.00,           +        "Plan Rows": 0,               +        "Plan Width": 0,              +        "Node/s": "All datanodes"     +      }                               +    }                                 +  ] (1 row)   --以YAML格式输出的执行计划(explain_perf_mode为normal时)。 gaussdb=# EXPLAIN(FORMAT YAML) SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000;            QUERY PLAN             ---------------------------------  - Plan:                        +      Node Type: "Data Node Scan"+      Startup Cost: 0.00         +      Total Cost: 0.00           +      Plan Rows: 0               +      Plan Width: 0              +      Node/s: "dn_6005_6006" (1 row)  --禁止开销估计的执行计划。 gaussdb=# EXPLAIN(COSTS FALSE)SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000;        QUERY PLAN        ------------------------  Data Node Scan    Node/s: dn_6005_6006 (2 rows)  --带有聚集函数查询的执行计划。 gaussdb=# EXPLAIN SELECT SUM(ca_address_sk) FROM tpcds.customer_address_p1 WHERE ca_address_sk<10000;                                       QUERY PLAN                                        ---------------------------------------------------------------------------------------  Aggregate  (cost=18.19..14.32 rows=1 width=4)    ->  Streaming (type: GATHER)  (cost=18.19..14.32 rows=3 width=4)          Node/s: All datanodes          ->  Aggregate  (cost=14.19..14.20 rows=3 width=4)                ->  Seq Scan on customer_address_p1  (cost=0.00..14.18 rows=10 width=4)                      Filter: (ca_address_sk < 10000) (6 rows)  --删除表tpcds.customer_address_p1。 gaussdb=# DROP TABLE tpcds.customer_address_p1;  --删除表tpcds.customer_address。 gaussdb=# DROP TABLE tpcds.customer_address;  --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE; 
``` |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### 相关链接

[ANALYZE | ANALYSE](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0519.html#ZH-CN_TOPIC_0000001865746680)

更多详情请参考GaussDB 文档中心:<https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html>