openGauss维护管理之EXPLAIN执行计划

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openGauss维护管理之EXPLAIN执行计划相关的知识,希望对你有一定的参考价值。

一、概述

1、功能描述

显示SQL语句的执行计划。

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

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

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

2、注意事项

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

START TRANSACTION;
EXPLAIN ANALYZE ...;
ROLLBACK;

  • 由于参数DETAIL、NODES、NUM_NODES是分布式模式下的功能,在单机模式中是被禁止使用的。假如使用,会产生如下错误。

openGauss=# create table student(id int, name char(20));
CREATE TABLE
openGauss=# explain (nodes true) insert into student values(5,a),(6,b);
ERROR: unrecognized EXPLAIN option "nodes"
openGauss=# explain (num_nodes true) insert into student values(5,a),(6,b);
ERROR: unrecognized EXPLAIN option "num_nodes"

3、语法格式

  • 显示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 ] |
FORMAT TEXT | XML | JSON | YAML

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

EXPLAIN   [   ANALYZE  | ANALYSE    ] [ VERBOSE  ]  | PERFORMANCE   statement;

4、参数说明

statement
指定要分析的SQL语句。

ANALYZE boolean | ANALYSE boolean
显示实际运行时间和其他统计数据。
取值范围:
TRUE(缺省值):显示实际运行时间和其他统计数据。
FALSE:不显示。

VERBOSE boolean
显示有关计划的额外信息。
取值范围:
TRUE(缺省值):显示额外信息。
FALSE:不显示。

COSTS boolean
包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。
取值范围:
TRUE(缺省值):显示估计总成本和宽度。
FALSE:不显示。

CPU boolean
打印CPU的使用情况的信息。
取值范围:
TRUE(缺省值):显示CPU的使用情况。
FALSE:不显示。

DETAIL boolean(不可用)
打印数据库节点上的信息。
取值范围:
TRUE(缺省值):打印数据库节点的信息。
FALSE:不打印。

NODES boolean(不可用)
打印query执行的节点信息。
取值范围:
TRUE(缺省值):打印执行的节点的信息。
FALSE:不打印。

NUM_NODES boolean(不可用)
打印执行中的节点的个数信息。
取值范围:
TRUE(缺省值):打印数据库节点个数的信息。
FALSE:不打印。

BUFFERS boolean
包括缓冲区的使用情况的信息。
取值范围:
TRUE:显示缓冲区的使用情况。
FALSE(缺省值):不显示。

TIMING boolean
包括实际的启动时间和花费在输出节点上的时间信息。
取值范围:
TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。
FALSE:不显示。

PLAN
是否将执行计划存储在plan_table中。当该选项开启时,会将执行计划存储在PLAN_TABLE中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。
取值范围:
ON(缺省值):将执行计划存储在plan_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUCCESS。
OFF:不存储执行计划,将执行计划打印到当前屏幕。

FORMAT
指定输出格式。
取值范围:TEXT、XML、JSON和YAML。
默认值:TEXT。

PERFORMANCE
使用此选项时,即打印执行中的所有相关信息。

二、示例

-- 1、创建一个表
openGauss=# create table test_t(c1 int, c2 varchar(30));
CREATE TABLE

-- 2、查看 SQL 的执行计划
openGauss=# explain select * from test_t;
QUERY PLAN
----------------------------------------------------------
Seq Scan on test_t (cost=0.00..17.29 rows=729 width=82)
(1 row)

-- 3、在查看计划时可以指定输出格式
-- 注意:只有当 explain_perf_mode 为 normal 时,才支持 json 格式
openGauss=# SET explain_perf_mode=normal;
SET
openGauss=# explain (format json) select * from test_t;
QUERY PLAN
----------------------------------
[ +
+
"Plan": +
"Node Type": "Seq Scan", +
"Relation Name": "test_t",+
"Alias": "test_t", +
"Startup Cost": 0.00, +
"Total Cost": 17.29, +
"Plan Rows": 729, +
"Plan Width": 82 +
+
+
]
(1 row)

-- 4、如果一个查询中的 where 子句的列有索引,在条件或数据等不一样时,可能会显示不同的执行计划
openGauss=# create index idx_test_t_c1 on test_t(c1);
CREATE INDEX
openGauss=# insert into test_t values(generate_series(1, 200), hello openGauss);
INSERT 0 200
openGauss=# explain select c1, c2 from test_t where c1=100;
QUERY PLAN
----------------------------------------------------------------------------
Bitmap Heap Scan on test_t (cost=4.28..12.74 rows=4 width=82)
Recheck Cond: (c1 = 100)
-> Bitmap Index Scan on idx_test_t_c1 (cost=0.00..4.28 rows=4 width=0)
Index Cond: (c1 = 100)
(4 rows)

-- 5、可以通过 costs 选项,指定是否显示开销
openGauss=# explain (costs false) select * from test_t where c1=100;
QUERY PLAN
------------------------------------------
Bitmap Heap Scan on test_t
Recheck Cond: (c1 = 100)
-> Bitmap Index Scan on idx_test_t_c1
Index Cond: (c1 = 100)
(4 rows)

openGauss维护管理之客户端连接工具gsql

一、概述

gsql是openGauss提供在命令行下运行的数据库连接工具,可以通过此工具连接服务器并对其进行操作和维护,除了具备操作数据库的基本功能,gsql还提供了若干高级特性,便于用户使用。

1、基本功能

**连接数据库:
gsql创建连接时,数据库默认设置会有5分钟超时时间。如果在这个时间内,数据库未正确地接受连接并对身份进行认证,gsql将超时退出。
**执行SQL语句:**支持交互式地键入并执行SQL语句,也可以执行一个文件中指定的SQL语句。
**执行元命令:**元命令可以帮助管理员查看数据库对象的信息、查询缓存区信息、格式化SQL输出结果、以及连接到新的数据库等。

2、高级特性

1、变量
gsql提供类似于Linux的shell命令的变量特性,可以使用gsql的原命令\\set设置一个变量,格式如下:
\\set varname value
要删除一个变量请使用如下方式:
\\unset varname
说明:
变量只是简单的名称/值对,这里的值可以是任意长度。
变量名称必须由字母(包括非拉丁字母)、数字和下划线组成,且对大小写敏感。
如果使用\\set varname的格式(不带第二个参数),则只是设置这个变量而没有给变量赋值。
可以使用不带参数的\\set来显示所有变量的值。
变量的示例和详细说明请参见变量。

2、SQL代换
利用gsql的变量特性,可以将常用的SQL语句设置为变量,以简化操作。
像元命令的参数一样,gsql变量的一个关键特性是可以把gsql变量替换成正规的SQL语句。此外,gsql还提供为变量更换新的别名或其他标识符等功能
。使用SQL代换方式替换一个变量的值可在变量前加冒号。例如:
openGauss=# \\set foo HR.areaS
openGauss=# select * from :foo;
area_id | area_name
---------+------------------------
4 | Middle East and Africa
3 | Asia
1 | Europe
2 | Americas
(4 rows)
执行以上命令,将会查询HR.areaS表。
须知: 变量的值是逐字复制的,甚至可以包含不对称的引号或反斜杠命令。所以必须保证输入的内容有意义。

3、自定义提示符
gsql使用的提示符支持用户自定义。可以通过修改gsql预留的三个变量PROMPT1、PROMPT2、PROMPT3来改变提示符。
这三个变量的值可以用户自定义,也可以使用gsql预定义的值。详细请参见提示符。

4、命令自动补齐
根据openGauss语法规则,gsql支持使用Tab键进行命令的自动补齐,当编译时指定了选项--with-readline,且客户端连接时指定“-r”参数,此功
能被打开。例如,crea后键入Tab,gsql会将其补齐为create。
说明:
支持数据库SQL关键字如select、create、table等。
支持表名、视图名等自定义标识符的补齐。
元命令选项S、+不支持自动补齐。
对表进行补齐时,只有前缀是“pg_”才会补齐系统表。
不支持建表时字段类型的补齐。
select后不支持任何补齐。
不支持常量与宏的自动补齐。
select * from a,b... 不支持第二个开始表的自动补齐, insert into t1 (col1, col2, ...) 不支持第二个列的自动补齐。
不支持create tablespace语句with以及with后参数的自动补齐。
创建索引不支持local、global的自动补齐,修改索引不支持rebuild自动补齐。
set语句仅支持自动补全USER和SUPERUSER级别的参数。
不支持if exists的自动补齐。
不支持表名.列名的自动补齐,如alter sequence <name> owned by tableName.colName,owned by。
不支持自定义操作符自动补齐。使用复制粘贴这种方式输入命令,如果粘贴的命令里面有TAB键有可能会使输入命令的格式错乱,无法正常执行。
"\\t\\n@$><=;|&() "这些特殊字符在sql语句中具有固定含义。如果自定义表名中包含这些特殊字符,那么输入的sql语句从这些字符开始不支持自
动补齐。

5、客户端操作历史记录
gsql支持客户端操作历史记录,当客户端连接时指定“-r”参数,此功能被打开。可以通过\\set设置记录历史的条数,例如,\\set HISTSIZE 50,将
记录历史的条数设置为50,\\set HISTSIZE 0,不记录历史。
说明:
客户端操作历史记录条数默认设置为32条,最多支持记录500条。当客户端交互式输入包含中文字符时,只支持UTF-8 的编码环境。
出于安全考虑,将包含PASSWORD、IDENTIFIED敏感词的记录识别为敏感信息,不会记录到历史信息中,即不能通过上下翻回显。

二、使用指导

数据库连接

1、使用gsql连接到openGauss服务器。
gsql工具使用-d参数指定目标数据库名、-U参数指定数据库用户名、-h参数指定主机名、-p参数指定端口号信息。
说明:
若未指定数据库名称,则使用初始化时默认生成的数据库名称;
若未指定数据库用户名,则默认使用当前操作系统用户作为数据库用户名;
当某个值没有前面的参数(-d、-U等)时,若连接的命令中没有指定数据库名(-d)则该参数会被解释成数据库名;
如果已经指定数据库名(-d)而没有指定数据库用户名(-U)时,该参数则会被解释成数据库用户名。
示例1,使用omm用户连接到本机postgres数据库的15400端口。
gsql -d postgres -p 15400
示例2,使用jack用户连接到远程主机postgres数据库的15400端口。
gsql -h 10.180.123.163 -d postgres -U jack -p 15400
示例3,参数postgres和omm不属于任何选项时,分别被解释成了数据库名和用户名。
gsql postgres omm -p 15400
等效于
gsql -d postgres -U omm -p 15400

连接参数
-h, --host=HOSTNAME
指定正在运行服务器的主机名或者Unix域套接字的路径。
如果省略主机名,gsql将通过Unix域套接字与本地主机的服务器相联,或者在没有Unix域套接字的机器上,通过TCP/IP与localhost连接。

-p, --port=PORT
指定数据库服务器的端口号。
可以通过port参数修改默认端口号。
默认为5432。

-U, --username=USERNAME
指定连接数据库的用户。
说明:
通过该参数指定用户连接数据库时,需要同时提供用户密码用以身份验证。您可以通过交换方式输入密码,或者通过-W参数指定密码。
用户名中包含有字符,需要在字符
前增加转义字符才可成功连接数据库。
字符串。默认使用与当前操作系统用户同名的用户。

-W, --password=PASSWORD
当使用-U参数连接远端数据库时,可通过该选项指定密码。
说明:
数据库主节点所在服务器后连接本地数据库主节点实例时,默认使用trust连接,会忽略此参数。
用户密码中包含特殊字符“\\”和“`”时,需要增加转义字符才可成功连接数据库。
如果用户未输入该参数,但是数据库连接需要用户密码,这时将出现交互式输入,请用户输入当前连接的密码。该密码最长长度为999字节,受限于GUC
参数password_max_length的最大值。
符合密码复杂度要求。

SQL语句

2、执行SQL语句。
以创建数据库human_staff为例。
CREATE DATABASE human_staff;
通常,输入的命令行在遇到分号的时候结束。如果输入的命令行没有错误,结果就会输出到屏幕上。

3、执行gsql元命令。
以列出openGauss中所有的数据库和描述信息为例。
openGauss=# \\l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
----------------+----------+-----------+---------+-------+-----------------------
human_resource | omm | SQL_ASCII | C | C |
postgres | omm | SQL_ASCII | C | C |
template0 | omm | SQL_ASCII | C | C | =c/omm +
| | | | | omm=CTc/omm
template1 | omm | SQL_ASCII | C | C | =c/omm +
| | | | | omm=CTc/omm
human_staff | omm | SQL_ASCII | C | C |
(5 rows)

示例
首先要创建一个表空间EXAMPLE:
openGauss=# CREATE TABLESPACE EXAMPLE RELATIVE LOCATION tablespace1/tablespace_1;
CREATE TABLESPACE

表空间创建成功后,创建schema HR:
openGauss=# CREATE schema HR;
CREATE SCHEMA

以把一个查询分成多行输入为例。注意提示符的变化:
openGauss=# CREATE TABLE HR.areaS(
openGauss(# area_ID NUMBER,
openGauss(# area_NAME VARCHAR2(25)
openGauss(# )tablespace EXAMPLE;
CREATE TABLE

查看表的定义:
openGauss=# \\d HR.areaS
Table "hr.areas"
Column | Type | Modifiers
-----------+-----------------------+-----------
area_id | numeric |
area_name | character varying(25) |
Tablespace: "example"

向HR.areaS表插入数据:
openGauss=# INSERT INTO HR.areaS (area_ID, area_NAME) VALUES (1, Europe);

查看表:
omm@[local] openGauss=#SELECT * FROM HR.areaS;
area_id | area_name
---------+------------------------
1 | Europe
4 | Middle East and Africa
2 | Americas
3 | Asia
(4 rows)

可以用\\pset命令以不同的方法显示表:
omm@[local] openGauss=#\\pset border 2
Border style is 2.
omm@[local] openGauss=#SELECT * FROM HR.areaS;
+---------+------------------------+
| area_id | area_name |
+---------+------------------------+
| 1 | Europe |
| 2 | Americas |
| 3 | Asia |
| 4 | Middle East and Africa |
+---------+------------------------+
(4 rows)
omm@[local] openGauss=#\\pset border 0
Border style is 0.
omm@[local] openGauss=#SELECT * FROM HR.areaS;
area_id area_name
------- ----------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
(4 rows)

查看会话数连接

查看指定用户的会话连接数上限
执行如下命令查看连接到指定用户USER1的会话连接数上限。其中-1表示没有对用户user1设置连接数的限制。
SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME=user1;

查看指定数据库的会话连接数上限。
SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME=postgres;

查看指定数据库已使用的会话连接数。
SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME=postgres;

以上是关于openGauss维护管理之EXPLAIN执行计划的主要内容,如果未能解决你的问题,请参考以下文章

openGauss维护管理之最大连接数设置

openGauss维护管理之基本操作

openGauss维护管理之客户端连接超时

openGauss维护管理之大小写敏感

openGauss维护管理之学校数据模型

openGauss维护管理之日志收集gs_collector