Skip to content

通过 EXPLAIN ANALYZE 获取信息

EXPLAIN ANALYZE 是一个用于查询的分析工具,它将向你显示 SQL 在查询上花费的时间以及原因。它将计划查询、检测它并执行它,同时计算行数并测量在执行计划的各个点花费的时间。执行完成后,EXPLAIN ANALYZE 将打印计划和测量结果,而不是查询结果。

EXPLAIN ANALYZE,它运行 SQL 语句产生 EXPLAIN 输出,此外,还产生其他信息,例如时间和基于迭代器的附加信息,以及关于优化器的预期与实际执行的匹配情况。

对于每个迭代器,提供以下信息:

  • 预计执行成本

成本模型没有考虑一些迭代器,因此不包括在估算中。

  • 估计的返回的行数

  • 返回第一行的时间

  • 执行此迭代器(仅包括子迭代器,但不包括父迭代器)所花费的时间,以毫秒为单位。

  • 迭代器返回的行数

  • 循环数

查询执行信息使用 TREE 输出格式显示,其中节点代表迭代器。EXPLAIN ANALYZE 始终使用 TREE 输出格式,也可以选择使用 FORMAT=TREE; 显式指定。其他格式 TREE 暂不支持。

EXPLAIN ANALYZE 可以与 SELECT 语句一起使用,也可以与多表 UPDATEDELETE 语句一起使用。

你可以使用 KILL QUERYCTRL-C 终止此语句。

EXPLAIN ANALYZE 不能与 FOR CONNECTION 一起使用。

示例

建表

CREATE TABLE t1 (
    c1 INTEGER DEFAULT NULL,
    c2 INTEGER DEFAULT NULL
);

CREATE TABLE t2 (
    c1 INTEGER DEFAULT NULL,
    c2 INTEGER DEFAULT NULL
);

CREATE TABLE t3 (
    pk INTEGER NOT NULL PRIMARY KEY,
    i INTEGER DEFAULT NULL
);

表输出结果

> EXPLAIN ANALYZE SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c2)\G
*************************** 1. row ***************************
QUERY PLAN: Project
*************************** 2. row ***************************
QUERY PLAN:   Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
*************************** 3. row ***************************
QUERY PLAN:   ->  Join
*************************** 4. row ***************************
QUERY PLAN:         Analyze: timeConsumed=5053us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
*************************** 5. row ***************************
QUERY PLAN:         Join Type: INNER
*************************** 6. row ***************************
QUERY PLAN:         Join Cond: (t1.c1 = t2.c2)
*************************** 7. row ***************************
QUERY PLAN:         ->  Table Scan on aaa.t1
*************************** 8. row ***************************
QUERY PLAN:               Analyze: timeConsumed=2176us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
*************************** 9. row ***************************
QUERY PLAN:         ->  Table Scan on aaa.t2
*************************** 10. row ***************************
QUERY PLAN:               Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
10 rows in set (0.00 sec)

> EXPLAIN ANALYZE SELECT * FROM t3 WHERE i > 8\G
*************************** 1. row ***************************
QUERY PLAN: Project
*************************** 2. row ***************************
QUERY PLAN:   Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
*************************** 3. row ***************************
QUERY PLAN:   ->  Table Scan on aaa.t3
*************************** 4. row ***************************
QUERY PLAN:         Analyze: timeConsumed=154us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
*************************** 5. row ***************************
QUERY PLAN:         Filter Cond: (CAST(t3.i AS BIGINT) > 8)
5 rows in set (0.00 sec)

> EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
*************************** 1. row ***************************
QUERY PLAN: Project
*************************** 2. row ***************************
QUERY PLAN:   Analyze: timeConsumed=0us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
*************************** 3. row ***************************
QUERY PLAN:   ->  Table Scan on aaa.t3
*************************** 4. row ***************************
QUERY PLAN:         Analyze: timeConsumed=309us inputRows=0 outputRows=0 inputSize=0bytes outputSize=0bytes memorySize=0bytes
*************************** 5. row ***************************
QUERY PLAN:         Filter Cond: (CAST(t3.pk AS BIGINT) > 17)
5 rows in set (0.00 sec)

该语句输出中显示的实际时间值以毫秒为单位。