VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

EXPLAIN

EXPLAIN - 显示语句的执行计划

语法格式

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

这里 option可以是:

    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    BUFFERS [ boolean ]
    TIMING [ boolean ]
    SUMMARY [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }

说明

此命令显示Vastbase E100计划程序为提供的语句生成的执行计划。执行计划显示如何扫描语句引用的表- 通过简单顺序扫描,索引扫描等 -如果引用了多个表,将使用哪些连接算法将每个表所需的行汇集在一起输入表。

显示的最关键部分是估计的语句执行成本,这是计划者猜测运行语句需要多长时间(以成本单位衡量,任意,但通常意味着磁盘页面提取)。实际上显示了两个数字:可以返回第一行之前的启动成本,以及返回所有行的总成本。对于大多数查询而言,总成本是重要的,但在诸如EXISTS中的子查询之类的上下文中,规划人员将选择最小的启动成本而不是最小的总成本(因为执行者将在获得一行后停止)。此外,如果您使用LIMIT 子句限制要返回的行数,则计划程序会在 endpoints成本之间进行适当的插值,以估算哪个计划确实最便宜。

ANALYZE选项导致语句实际执行,而不仅是计划。然后将实际运行时统计信息添加到显示中,包括每个计划节点内消耗的总耗用时间(以毫秒为单位)以及实际返回的总行数。这对于了解规划师的估计是否接近现实非常有用。

注意

请记住,在使用 ANALYZE 选项时,实际上会执行该语句。虽然 EXPLAIN 将丢弃SELECT 将返回的任何输出,但该语句的其他副作用将照常发生。如果您希望在INSERT , UPDATE , DELETE , CREATE TABLE AS 或 EXECUTE 语句中使用EXPLAIN ANALYZE 而不让命令影响您的数据,请使用以下方法:

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;

只能指定 ANALYZE 和 VERBOSE选项,并且只能按顺序指定,而不包括括号中的选项列表。在Vastbase E100 9.0之前,支持的语法是唯一的。预计所有新选项仅在括号语法中受支持。

参数说明

  • ANALYZE

    执行命令并显示实际运行时间和其他统计信息。此参数说明默认为 FALSE 。

  • VERBOSE

    显示有关计划的其他信息。具体来说,包括计划树中每个节点的输出列列表,schema-qualify表和函数名称,始终在表达式中使用其范围表别名标记变量,并始终打印显示统计信息的每个触发器的名称。此参数说明默认为 FALSE 。

  • COSTS

    包括有关每个计划节点的估计启动和总成本的信息,以及估计的行数和每行的估计宽度。此参数说明默认为 TRUE 。

  • BUFFERS

    包含有关缓冲区使用情况的信息。具体来说,包括命中,读取,弄脏和写入的共享块的数量,命中,读取,弄脏和写入的本地块的数量,以及读取和写入的临时块的数量。命中意味着避免了读取,因为在需要时已在缓存中找到该块。共享块包含来自常规表和索引的数据;本地块包含临时表和索引的数据;临时块包含用于排序,散列,物化计划节点和类似情况的短期工作数据。脏块数表示此查询更改的先前未修改块的数量;而写入的块数表示在查询处理期间由此后端从缓存中逐出的先前脏污块的数量。为上级节点显示的块数包括其所有子节点使用的块数。在文本格式中,仅打印非零值。仅当ANALYZE 也启用时,才能使用此参数说明。它默认为 FALSE 。

  • TIMING

    包括输出中每个节点花费的实际启动时间和时间。重复读取系统时钟的开销可能会在某些系统上显着降低查询速度,因此,当仅需要实际行计数而非精确时间时,将此参数说明设置为FALSE可能很有用。始终测量整个语句的运行时间,即使使用此选项关闭节点级时序也是如此。仅当ANALYZE 也启用时,才能使用此参数说明。它默认为 TRUE 。

  • SUMMARY

    在查询计划之后包括摘要信息(例如,总计时间信息)。使用 ANALYZE时默认包含摘要信息,但不包括在内默认,但可以使用此选项启用。如有必要,EXPLAIN EXECUTE中的计划时间包括从缓存中获取计划所需的时间以及重新计划所需的时间。

  • FORMAT

    指定输出格式,可以是TEXT,XML,JSON或YAML。非文本输出包含与文本输出格式相同的信息,但程序更容易解析。此参数说明默认为TEXT 。

  • boolean

    指定是应打开还是关闭所选选项。您可以编写 TRUE , ON 或 1来启用该选项,并使用 FALSE , OFF 或 0 来禁用它。 boolean 值也可以省略,在这种情况下假定为 TRUE 。

  • statement

    任何 SELECT , INSERT , UPDATE , DELETE , VALUES , EXECUTE ,DECLARE , CREATE TABLE AS 或 CREATE MATERIALIZED VIEW AS语句,您希望查看其执行计划。

输出

该命令的结果是为 statement选择的计划的文本描述,可选择使用执行统计信息进行注释。

注意事项

为了使Vastbase E100查询规划器在优化查询时做出合理的决策,pg_statistic数据应该是查询中使用的所有表的最新数据。通常 autovacuum daemon会自动处理。但是如果表最近的内容发生了重大变化,您可能需要手动ANALYZE而不是等待autovacuum来赶上更改。

为了测量执行计划中每个节点的运行时成本, EXPLAIN ANALYZE的当前实现为查询执行添加了分析开销。因此,在查询上运行 EXPLAIN ANALYZE有时会比正常执行查询花费更长的时间。开销量取决于查询的性质以及所使用的平台。最糟糕的情况发生在计划节点上,这些节点本身每次执行只需要很少的时间,并且在操作系统调用相对较慢以获取时间的计算机上。

示例

要在具有单个 integer列和10000行的表上显示简单查询的计划,请执行以下操作:

EXPLAIN SELECT * FROM foo;

                       QUERY PLAN
---------------------------------------------------------
 Seq Scan on foo  (cost=0.00..155.00 rows=10000 width=4)
(1 row)

这是相同的查询,具有JSON输出格式:

EXPLAIN (FORMAT JSON) SELECT * FROM foo;
           QUERY PLAN
--------------------------------
 [                             +
   {                           +
     "Plan": {                 +
       "Node Type": "Seq Scan",+
       "Relation Name": "foo", +
       "Alias": "foo",         +
       "Startup Cost": 0.00,   +
       "Total Cost": 155.00,   +
       "Plan Rows": 10000,     +
       "Plan Width": 4         +
     }                         +
   }                           +
 ]
(1 row)

如果存在索引并且我们使用具有可索引 WHERE 条件的查询, EXPLAIN 可能会显示不同的计划:

EXPLAIN SELECT * FROM foo WHERE i = 4;

                         QUERY PLAN
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 rows)

这是相同的查询,但是采用YAML格式:

EXPLAIN (FORMAT YAML) SELECT * FROM foo WHERE i='4';
          QUERY PLAN
-------------------------------
 - Plan:                      +
     Node Type: "Index Scan"  +
     Scan Direction: "Forward"+
     Index Name: "fi"         +
     Relation Name: "foo"     +
     Alias: "foo"             +
     Startup Cost: 0.00       +
     Total Cost: 5.98         +
     Plan Rows: 1             +
     Plan Width: 4            +
     Index Cond: "(i = 4)"
(1 row)

XML格式留给读者练习。

以下是同一计划,其成本估算被抑制:

EXPLAIN (COSTS FALSE) SELECT * FROM foo WHERE i = 4;

        QUERY PLAN
----------------------------
 Index Scan using fi on foo
   Index Cond: (i = 4)
(2 rows)

以下是使用聚合函数的查询的查询计划示例:

EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;

                             QUERY PLAN
---------------------------------------------------------------------
 Aggregate  (cost=23.93..23.93 rows=1 width=4)
   ->  Index Scan using fi on foo  (cost=0.00..23.92 rows=6 width=4)
         Index Cond: (i < 10)
(3 rows)

以下是使用 EXPLAIN EXECUTE 显示准备好的查询的执行计划的示例:

PREPARE query(int, int) AS SELECT sum(bar) FROM test
    WHERE id > $1 AND id < $2
    GROUP BY foo;

EXPLAIN ANALYZE EXECUTE query(100, 200);

                                                       QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=9.54..9.54 rows=1 width=8) (actual time=0.156..0.161 rows=11 loops=1)
   Group Key: foo
   ->  Index Scan using test_pkey on test  (cost=0.29..9.29 rows=50 width=8) (actual time=0.039..0.091 rows=99 loops=1)
         Index Cond: ((id > $1) AND (id < $2))
 Planning time: 0.197 ms
 Execution time: 0.225 ms
(6 rows)

当然,此处显示的具体数字取决于所涉及表格的实际内容。另请注意,由于计划程序的改进,Vastbase E100版本之间的数字甚至所选的查询策略可能会有所不同。此外, ANALYZE命令使用随机采样来估计数据统计;因此,即使表中数据的实际分布没有改变,成本估算也可能在新的ANALYZE 之后发生变化。