EXPLAIN 和 PROFILE
EXPLAIN语句输出 nGQL 语句的执行计划,但不会执行 nGQL 语句。
PROFILE语句执行 nGQL 语句,然后输出执行计划和执行概要。用户可以根据执行计划和执行概要优化查询性能。
执行计划
执行计划由 悦数图数据库 查询引擎中的执行计划器决定。
执行计划器将解析后的 nGQL 语句处理为action。action是最小的执行单元。典型的action包括获取指定点的所有邻居、获取边的属性、根据条件过滤点或边等。每个action都被分配给一个operator。
例如SHOW TAGS语句分为两个action,operator为Start和ShowTags。更复杂的GO语句可能会被处理成 10 个以上的action。
语法
-
EXPLAINEXPLAIN [format= {"row" | "dot" | "tck"}] <your_nGQL_statement>; -
PROFILEPROFILE [format= {"row" | "dot" | "tck"}] <your_nGQL_statement>;
输出格式
EXPLAIN或PROFILE语句的输出有三种格式:row(默认)、dot和tck。用户可以使用format选项修改输出格式。
row格式
row格式将返回信息输出到一个表格中。
-
EXPLAINnebula> EXPLAIN format="row" SHOW TAGS;Execution succeeded (time spent 327/892 us)Execution Plan-----+----------+--------------+----------------+----------------------------------------------------------------------| id | name | dependencies | profiling data | operator info |-----+----------+--------------+----------------+----------------------------------------------------------------------| 1 | ShowTags | 0 | | outputVar: [{"colNames":[],"name":"__ShowTags_1","type":"DATASET"}] || | | | | inputVar: |-----+----------+--------------+----------------+----------------------------------------------------------------------| 0 | Start | | | outputVar: [{"colNames":[],"name":"__Start_0","type":"DATASET"}] |-----+----------+--------------+----------------+---------------------------------------------------------------------- -
PROFILEnebula> PROFILE format="row" SHOW TAGS;+--------+| Name |+--------+| player || team |+--------+Got 2 rows (time spent 2038/2728 us)Execution Plan-----+----------+--------------+----------------------------------------------------+----------------------------------------------------------------------| id | name | dependencies | profiling data | operator info |-----+----------+--------------+----------------------------------------------------+----------------------------------------------------------------------| 1 | ShowTags | 0 | ver: 0, rows: 1, execTime: 42us, totalTime: 1177us | outputVar: [{"colNames":[],"name":"__ShowTags_1","type":"DATASET"}] || | | | | inputVar: |-----+----------+--------------+----------------------------------------------------+----------------------------------------------------------------------| 0 | Start | | ver: 0, rows: 0, execTime: 1us, totalTime: 57us | outputVar: [{"colNames":[],"name":"__Start_0","type":"DATASET"}] |-----+----------+--------------+----------------------------------------------------+----------------------------------------------------------------------
| 参数 | 说明 |
|---|---|
id | operator的 ID。 |
name | operator的名称。 |
dependencies | 当前operator所依赖的operator的 ID。 |
profiling data | 执行概要文件内容。 ver表示operator的版本;rows表示operator输出结果的行数;execTime表示执行action的时间;totalTime表示执行action的时间、系统调度时间、排队时间的总和。 |
operator info | operator的详细信息。 |
dot格式
dot格式将返回 DOT 语言的信息,然后用户可以使用 Graphviz 生成计划图。
备注
Graphviz 是一款开源可视化图工具,可以绘制 DOT 语言脚本描述的图。Graphviz 提供一个在线工具,可以预览 DOT 语言文件,并将它们导出为 SVG 或 JSON 等其他格式。详情请参见 Graphviz Online。
nebula> EXPLAIN format="dot" SHOW TAGS;
Execution succeeded (time spent 161/665 us)
Execution Plan
--------------------------------------------------------------------------------------------------------------------------------------------- -------------
plan
--------------------------------------------------------------------------------------------------------------------------------------------- -------------
digraph exec_plan {
rankdir=LR;
"ShowTags_0"[label="ShowTags_0|outputVar: \[\{\"colNames\":\[\],\"name\":\"__ShowTags_0\",\"type\":\"DATASET\"\}\]\l|inputVar:\l", shape=Mrecord];
"Start_2"->"ShowTags_0";
"Start_2"[label="Start_2|outputVar: \[\{\"colNames\":\[\],\"name\":\"__Start_2\",\"type\":\"DATASET\"\}\]\l|inputVar: \l", shape=Mrecord];
}
--------------------------------------------------------------------------------------------------------------------------------------------- -------------
将上述示例的 DOT 语言转换为 Graphviz 图,如下所示。

tck格式
tck格式类似于表格,但是没有边框和行之间的间的分割线。用户可以将结果用在单元测试的测试用例中。
关于tck格式的测试用例,参见 TCK case。
-
EXPLAINnebula> EXPLAIN format="tck" FETCH PROP ON player "player_1","player_2","player_3" YIELD properties(vertex).name as name, properties(vertex).age as age;Execution succeeded (time spent 261µs/613.718µs)Execution Plan (optimize time 28 us)| id | name | dependencies | profiling data | operator info || 2 | Project | 1 | | || 1 | GetVertices | 0 | | || 0 | Start | | | |Wed, 22 Mar 2023 23:15:52 CST -
PROFILEnebula> PROFILE format="tck" FETCH PROP ON player "player_1","player_2","player_3" YIELD properties(vertex).name as name, properties(vertex).age as age;| name | age || "Piter Park" | 24 || "aaa" | 24 || "ccc" | 24 |Got 3 rows (time spent 1.474ms/2.19677ms)Execution Plan (optimize time 41 us)| id | name | dependencies | profiling data | operator info || 2 | Project | 1 | {"rows":3,"version":0} | || 1 | GetVertices | 0 | {"resp[0]":{"exec":"232(us)","host":"127.0.0.1:9779","total":"758(us)"},"rows":3,"total_rpc":"875(us)","version":0} | || 0 | Start | | {"rows":0,"version":0} | |Wed, 22 Mar 2023 23:16:13 CST