Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/tuning/ Documentation version: v5.3.2 # 性能调优 GQL 会为每个查询生成一个执行计划,以确定如何高效地执行查询。您可以查看执行计划,从而了解查询的执行方式,并相应地优化查询性能。 ## 执行计划的组成 查询的执行计划由一个计划节点树组成,每个节点拥有零个或多个子计划节点。为了生成执行计划,系统将计划转换为一组流水线。每条流水线由一系列线性算子组成,对应于计划的线性子树。通过断开每个父节点下的所有子节点(除只有一个子节点的父节点外),将计划树分解为一组线性子树。在运行时,执行引擎根据流水线作为基本单位进行调度。 ## 查询执行过程 下图演示了 GQL 查询执行过程中执行计划是如何生成的: ```` GQL 查询字符串 // 用户输入的查询命令 | | v 解析器 // 解析查询命令,生成抽象语法树(Abstract Syntax Tree,简称 AST) | | v 验证器 // 验证 AST,确保查询命令在语法和语义上正确 | | v 规划器 // 生成查询的逻辑计划 | | v 优化器 // 优化逻辑计划,生成物理计划 | | v 执行引擎 // 生成执行计划,并根据执行计划生成查询结果 ```` ## 查看执行计划 当查询速度不及预期时,您可以使用 [EXPLAIN](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/tuning/explain/) 或 [PROFILE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/tuning/profile/) 命令来查看执行计划并定位性能瓶颈。推荐的排查流程如下: 1. 运行`EXPLAIN`检查最终生成的执行计划结构。 2. 确认高选择率的过滤条件或查询起始点是否已尽可能早地在计划中生效(例如是否成功下推)。 3. 运行`PROFILE`查看实际处理的行数、执行耗时以及各算子的计算开销。 4. 若查询包含子查询或是图模式查询,可分别使用`EXPLAIN DECORRELATED`或`EXPLAIN CBO`来查看优化效果。若要对比`MATCH`模式展开顺序重排带来的差异,请先通过`SESSION SET enable_reorder = true`或`/*+ SET_VAR(enable_reorder=true) */`显式开启重排。 5. 若在启用`enable_reorder`后,重排导致性能下降,可考虑添加`NO_REORDER`路径提示,仅为某一条路径固定展开顺序。更多信息,请参见 [NO_REORDER 提示](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/executions/hints/#no_reorder_hint)。 6. 如有必要,可将其与`EXPLAIN RAW`的输出结果进行对比,以了解优化器对原始计划具体做了哪些调整。 在使用 ngql CLI 时,您还可以通过`:planstyle`命令来调整执行计划的显示样式。更多信息,请参见 ngql 文档中的[设置执行计划展示视图](https://dev-docs.yueshu.com.cn/v5.3.2/utilities/ngql/usage/#execution_plan_style_setting)。