400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
工具指南
数据类型
存储引擎
执行引擎
系统配置参数
SQL 参考
常见问题(FAQ)
新架构 FAQ
集群部署 FAQ
SQL 查询 FAQ
MatrixGate FAQ
运维 FAQ
监控告警 FAQ
PXF FAQ
PLPython FAQ
性能 FAQ
显示语句的查询计划。
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ANALYZE] [VERBOSE] statement
其中option可以是以下之一:
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
BUFFERS [ boolean ]
TIMING [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
EXPLAIN显示 YMatrix 或Postgres优化器为提供的语句生成的查询计划。 查询计划是节点的查询树计划。 计划中的每个节点代表一个单独的操作,例如表扫描,连接,聚合或排序。
应从下至上阅读计划,因为每个节点都会向其上方的节点中发送行。 计划的最底层节点通常是表扫描操作(顺序扫描,索引扫描或位图索引扫描)。 如果查询需要连接,聚集或排序(或原始行上的其他操作),则扫描节点上方将有其他节点来执行这些操作。 最顶层的计划节点通常是 YMatrix 数据库motion节点(重新分发,显式重新分发,广播或收集motion)。 这些操作负责在查询处理期间在segment实例之间移动行。
EXPLAIN的输出对于计划树中的每个节点都有一行, 显示基本节点类型以及计划者为执行该计划节点而进行的以下成本估算:
重要的是要注意,上级节点的成本包括其所有子节点的成本。 计划的最高节点具有该计划的估计总执行成本。 这是计划者要尽量减少的数字。 同样重要的是要意识到,成本只反映查询优化器关心的事情。 特别是,成本不考虑将结果行传输到客户端所花费的时间。
EXPLAIN ANALYZE导致语句实际执行,而不仅仅是做计划。 EXPLAIN ANALYZE优化器会显示实际结果以及计划者的估计。 这对于查看优化器的估计是否接近实际很有用。 除了EXPLAIN计划中显示的信息之外,EXPLAIN ANALYZE还将显示以下附加信息:
Work_mem used: 64K bytes avg, 64K bytes max (seg0). Work_mem wanted: 90K bytes avg, 90K bytes max (seg0) to abate workfile I/O affecting 2 workers. [seg0] pass 0: 488 groups made from 488 rows; 263 rows written to workfile [seg0] pass 1: 263 groups made from 263 rows
注意:请记住,使用ANALYZE时实际上会执行该语句。 尽管EXPLAIN ANALYZE将丢弃SELECT将返回的任何输出,但是该语句的其他副作用将照常发生。 如果希望在DML语句上使用EXPLAIN ANALYZE而不让命令影响您的数据,请使用以下方法:
BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
仅可以指定ANALYZE和VERBOSE选项,并且只能按该顺序指定,而不要在括号中包含选项列表。
ANALYZE
VERBOSE
COSTS
BUFFERS
TIMING
FORMAT
boolean
statement
为了使查询优化器在优化查询时能够做出合理的决策,应运行ANALYZE语句以记录有关表内数据分布的统计信息。 如果您尚未执行此操作(或者自上次运行ANALYZE以来,表中数据的统计分布已发生重大变化), 则估计成本不太可能符合查询的实际属性,因此可能会选一个较差的查询计划。
在执行EXPLAIN ANALYZE命令期间运行的SQL语句从 YMatrix 数据库资源队列中排除。
为了说明如何读取EXPLAIN查询计划,请考虑一个非常简单的查询的示例:
EXPLAIN SELECT * FROM names WHERE name = 'Joelle';
QUERY PLAN
-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.27 rows=1 width=58)
-> Seq Scan on names (cost=0.00..431.27 rows=1 width=58)
Filter: (name = 'Joelle'::text)
Optimizer: Pivotal Optimizer (GPORCA) version 3.23.0
(4 rows)
如果我们自下而上阅读计划,则查询优化器将从对names表的顺序扫描开始。 请注意,WHERE子句被用作过滤条件。 这意味着扫描操作将检查其扫描的每一行的条件,并仅输出通过条件的行。
扫描操作的结果将传递到gather motion操作。 在 YMatrix 数据库中,gather motion是将segment行发送到master。 在这种情况下,我们有3个segment实例发送到1个master实例(3:1)。 该操作在并行查询执行计划的slice1上进行。 在 YMatrix 数据库中,查询计划分为多个切片,以便查询计划的各个部分可以由这些segment并行处理。
该计划的估计启动成本为00.00(无成本),总成本为431.27。 优化器估计此查询将返回一行。
这是相同的查询,但成本估算被抑制:
EXPLAIN (COSTS FALSE) SELECT * FROM names WHERE name = 'Joelle';
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Seq Scan on names
Filter: (name = 'Joelle'::text)
Optimizer: Pivotal Optimizer (GPORCA) version 3.23.0
(4 rows)
这是使用JSON格式的相同查询:
EXPLAIN (FORMAT JSON) SELECT * FROM names WHERE name = 'Joelle';
QUERY PLAN
-----------------------------------------------
[ +
{ +
"Plan": { +
"Node Type": "Gather Motion", +
"Senders": 3, +
"Receivers": 1, +
"Slice": 1, +
"Segments": 3, +
"Gang Type": "primary reader", +
"Startup Cost": 0.00, +
"Total Cost": 431.27, +
"Plan Rows": 1, +
"Plan Width": 58, +
"Plans": [ +
{ +
"Node Type": "Seq Scan", +
"Parent Relationship": "Outer", +
"Slice": 1, +
"Segments": 3, +
"Gang Type": "primary reader", +
"Relation Name": "names", +
"Alias": "names", +
"Startup Cost": 0.00, +
"Total Cost": 431.27, +
"Plan Rows": 1, +
"Plan Width": 58, +
"Filter": "(name = 'Joelle'::text)"+
} +
] +
}, +
"Settings": { +
"Optimizer": "Pivotal Optimizer (GPORCA) version 3.23.0" +
} +
} +
]
(1 row)
如果存在索引,并且我们使用带有可索引WHERE条件的查询,则EXPLAIN可能会显示不同的计划。 此查询使用YAML格式生成带有索引扫描的计划:
EXPLAIN (FORMAT YAML) SELECT * FROM NAMES WHERE LOCATION='Sydney, Australia';
QUERY PLAN
--------------------------------------------------------------
- Plan: +
Node Type: "Gather Motion" +
Senders: 3 +
Receivers: 1 +
Slice: 1 +
Segments: 3 +
Gang Type: "primary reader" +
Startup Cost: 0.00 +
Total Cost: 10.81 +
Plan Rows: 10000 +
Plan Width: 70 +
Plans: +
- Node Type: "Index Scan" +
Parent Relationship: "Outer" +
Slice: 1 +
Segments: 3 +
Gang Type: "primary reader" +
Scan Direction: "Forward" +
Index Name: "names_idx_loc" +
Relation Name: "names" +
Alias: "names" +
Startup Cost: 0.00 +
Total Cost: 7.77 +
Plan Rows: 10000 +
Plan Width: 70 +
Index Cond: "(location = 'Sydney, Australia'::text)"+
Settings: +
Optimizer: "Pivotal Optimizer (GPORCA) version 3.23.0"
(1 row)
在SQL标准中没有定义EXPLAIN语句。