VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

EXPLAIN PLAN

功能描述

通过EXPLAIN PLAN命令可以将查询执行的计划信息存储于PLAN_TABLE表中。与EXPLAIN命令不同的是,EXPLAIN PLAN仅将计划信息进行存储,而不会打印到屏幕。

注意事项

  • 对于执行错误的SQL无法进行计划信息的收集。
  • PLAN_TABLE中的数据是session级生命周期并且session隔离和用户隔离,用户只能看到当前session、当前用户的数据。

语法格式

EXPLAIN PLAN
[ SET STATEMENT_ID = string ]
FOR statement ;

参数说明

  • PLAN

    EXPLAIN中的PLAN选项表示需要将计划信息存储于PLAN_TABLE中,存储成功将返回EXPLAIN SUCCESS

  • STATEMENT_ID

    表示用户可以对查询设置标签,输入的标签信息也将存储于PLAN_TABLE中。

    用户在执行EXPLAIN PLAN时,如果没有使用SET STATEMENT_ID = string设置SETSTATEMENT_ID,则默认为空值。同时,用户可输入的STATEMENT_ID最大长度为30个字节,超过长度将会产生报错。

  • statement

    用户待查询执行计划的SQL语句,此语句必须是有效且当前用户有权限执行的。

示例

使用EXPLAIN PLAN收集SQL语句的执行计划,通常包括以下步骤:

1、创建模式vb。

执行EXPLAIN PLAN 后会将计划信息自动存储于PLAN_TABLE中,不支持对PLAN_TABLE进行INSERT、UPDATE、ANALYZE等操作。 PLAN_TABLE详细介绍见PLAN_TABLE

DROP SCHEMA IF EXISTS vb CASCADE;
CREATE SCHEMA vb;

2、创建测试表。

CREATE TABLE vb.t (
 id integer primary key NOT NULL,
 a integer DEFAULT NULL,
 b integer DEFAULT NULL
) ;

3、创建函数。

create or replace function vb.creatData() returns 
boolean AS
$BODY$
declare ii integer;
 begin
 II:=1;
 FOR ii IN 1..500000 LOOP
 INSERT INTO vb.t (id,a,b) VALUES (ii,ii,ii);
 end loop;
 return true;
 end;
$BODY$
LANGUAGE plpgsql;

4、向表中插入数据。

select * from vb.creatData() as testexplain;

5、创建索引。

create index ind_a on vb.T(a);

6、执行EXPLAIN PLAN 后会将计划信息自动存储于PLAN_TABLE中。

explain plan SET STATEMENT_ID = 'test_ex_plan01' FOR SELECT MAX(id),AVG(b) from vb.T where a between 3764 and 47491;

7、查询PLAN_TABLE。

SELECT * FROM PLAN_TABLE;

返回结果为:

  statement_id  |     plan_id      | id |  operation   |      options      | object_name | object_type | object_owner |   projection    |
cost       | cardinality

----------------+------------------+----+--------------+-------------------+-------------+-------------+--------------+-----------------+-------
-----------+-------------
 test_ex_plan01 | 6473924464813365 |  1 | AGGREGATE    | PLAIN             |             |             |              | max(id), avg(b) | 3380.2
2577317446 |           1
 test_ex_plan01 | 6473924464813365 |  2 | TABLE ACCESS | BITMAP HEAP SCAN  | t           | TABLE       | vb           | id, a, b        | 3367.7
1327317446 |        2500
 test_ex_plan01 | 6473924464813365 |  3 | INDEX        | BITMAP INDEX SCAN | ind_a       | INDEX       | vb           |                 |
     53.25 |        2500
(3 rows)

8、清理PLAN_TABLE表中的数据。

DELETE FROM PLAN_TABLE WHERE STATEMENT_ID = 'test_ex_plan01';