查询优化
Neo4j 旨在尽可能快地执行查询。然而,在优化最大查询执行性能时,利用关于领域和应用程序的知识来重新措辞查询可能会有所帮助。
本页面包含有关如何使用不同策略优化查询的信息。
有关更改查询运行时环境的信息,请参阅关于Cypher® 运行时概念的页面。
查询选项
查询执行可以通过使用查询选项进行微调。
为了使用一个或多个这些选项,查询必须以 CYPHER
为前缀,后跟查询选项,示例如下
CYPHER query-option [further-query-options] query
有关 Cypher 中可用各种运行时环境的信息,请参阅Cypher 运行时。
Cypher 规划器
Cypher 规划器接收 Cypher 查询并计算一个解决该查询的执行计划。对于任何给定的查询,很可能存在多个执行计划候选项,每个候选项都以不同的方式解决查询。规划器使用搜索算法来查找估计执行成本最低的执行计划。
下表描述了可用的规划器选项
查询选项 | 描述 | 默认值 | ||
---|---|---|---|---|
|
使用基于成本的规划,并对计划搜索空间和时间设置默认限制。 |
|
||
|
|
|||
|
使用基于成本的规划,不对计划搜索空间和时间设置限制,以穷尽搜索最佳执行计划。
|
Cypher 连接组件规划器
Cypher 规划器的一部分负责将独立模式的子计划组合成更大的计划——这项任务被称为连接组件。
下表描述了连接组件规划器的可用查询选项
查询选项 | 描述 | 默认值 | ||
---|---|---|---|---|
|
在组合子计划时使用贪婪方法。
|
|||
|
在组合子计划时使用基于成本的 IDP 搜索算法。
|
|
Cypher 查询选项 |
Cypher 更新策略
此选项影响更新查询的急切性。
可能的值为
查询选项 | 描述 | 默认值 |
---|---|---|
|
更新查询在需要时会急切地执行。 |
|
|
更新查询总是急切地执行。 |
Cypher 表达式引擎
此选项影响运行时如何评估表达式。
可能的值为
查询选项 | 描述 | 默认值 |
---|---|---|
|
在需要时编译表达式并使用编译后的表达式引擎。 |
|
|
始终使用解释型表达式引擎。 |
|
|
始终编译表达式并使用编译型表达式引擎。 |
Cypher 操作符引擎
此查询选项影响流水线运行时是否尝试为操作符组生成编译代码。
可能的值为
查询选项 | 描述 | 默认值 |
---|---|---|
|
在适用时尝试生成编译操作符。 |
|
|
从不尝试生成编译操作符。 |
|
|
始终尝试生成编译型操作符。 不能与 |
Cypher 解释型管道回退
此查询选项影响流水线运行时对于它不直接支持的操作符的行为方式。
可用选项为
查询选项 | 描述 | 默认值 | ||
---|---|---|---|---|
|
等同于 |
|
||
|
如果计划包含流水线运行时不支持的任何操作符,则会选择另一个运行时来执行整个计划。 不能与 |
|||
|
执行计划的部分可以在另一个运行时上执行。只有某些操作符被允许在另一个运行时上执行。 不能与 |
|||
|
执行计划的部分可以在另一个运行时上执行。任何操作符都被允许在另一个运行时上执行。设置此选项的查询可能会产生不正确的结果,或失败。 不能与
|
Cypher 重新规划
Cypher 重新规划在以下情况下发生
-
当查询不在缓存中时。这可能是服务器首次启动或重启时、缓存最近被清除时,或者当
server.memory.query_cache.per_db_cache_num_entries
超出限制时。 -
当时间已超过
dbms.cypher.min_replan_interval
值,并且数据库统计信息的变化超过dbms.cypher.statistics_divergence_threshold
值时。
在某些情况下,Cypher 查询规划可能会在非理想时间发生。例如,当查询必须尽可能快地执行且已存在有效计划时。
重新规划并非对所有查询同时进行;它在与运行查询相同的线程中执行,并可能阻塞查询。但是,重新规划一个查询不会重新规划任何其他查询。 |
有三种不同的重新规划选项可用
选项 | 描述 | 默认值 |
---|---|---|
|
这是如上所述的规划和重新规划选项。 |
|
|
这将强制进行重新规划,即使根据规划规则该计划是有效的。新计划完成后,它将替换查询缓存中现有计划。 |
|
|
如果已存在有效计划,即使规划规则通常要求重新规划,也会使用该计划。 |
重新规划选项前置于查询。
例如
CYPHER replan=force MATCH ...
在混合工作负载中,您可以使用 Cypher EXPLAIN
命令强制重新规划。这对于在已知低负载时段安排耗费规划时间的查询重新规划很有用。使用 EXPLAIN
将确保查询仅被规划,而不会被执行。
例如
CYPHER replan=force EXPLAIN MATCH ...
在已知高负载时段,replan=skip
可用于避免引入不必要的延迟峰值。
Cypher 推断模式部分
对于某些查询,规划器可以从图结构中推断出谓词(例如标签或类型),从而增强其估计每个操作符将产生行数的能力。(有关操作符作用和查询执行计划中估计行数的更多信息,请参阅理解执行计划 - 阅读执行计划。)选项 inferSchemaParts
控制规划器推断谓词的程度。
选项 | 描述 |
---|---|
|
不推断任何谓词。 |
|
关系类型用于推断连接节点上的标签。对应节点数量最少的标签用于估计行数。避免推断多个标签可以提高具有多个依赖标签的节点(例如每个 |
如果未提供此查询选项,则将使用操作手册 → 配置设置 → dbms.cypher.infer_schema_parts中设置的值。