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';