提高 Cypher 性能

此页面介绍了一些可以采取的步骤来提高工作负载的 Cypher 性能。

带有字面值的 Cypher 语句

Cypher 性能较差的主要原因之一是运行了许多带有字面值的 Cypher 语句。这会导致 Cypher 处理效率低下,因为目前不使用参数。因此,您无法完全从执行计划缓存中获益,而执行计划缓存会在其他情况下出现。

以下 Cypher 查询在形式上相同,但使用不同的字面量

MATCH (tg:asset) WHERE tg.name = "ABC123"
MERGE (tg)<-[:TAG_OF]-(z1:tag {name: "/DATA01/" + tg.name + "/Top_DOOR"})
MERGE (tg)<-[:TAG_OF]-(z2:tag {name: "/DATA01/" + tg.name + "/Data_Vault"})

在这种情况下,查询解析和执行计划生成会多次发生,从而导致效率降低。解决此问题的一种方法是将前一个示例重写如下

MATCH (tg:asset) WHERE tg.name = $tgName
WITH tg
UNWIND $tags as tag
MERGE (tg)<-[:TAG_OF]-(:tag {name: tag.name})

通过用参数替换查询中的字面量,您可以获得更好的执行计划缓存重用。您的应用程序需要将所有值放在参数列表中,然后您可以发出一个遍历它们的语句。进行这些更改将提高执行和内存使用效率。

查看查询和模型

您可以采取的第一项操作是查看和列出所有 Cypher 查询。最好的起点是充分了解提交的 Cypher 查询的顺序和频率。

此外,如果查询是由框架生成的,那么将它们以 Cypher 形式记录下来以方便查看至关重要。

您还可以通过在 Cypher 查询前面添加 EXPLAIN(查看执行计划而不运行查询)或 PROFILE(运行和分析查询)来分析 Cypher 查询。阅读有关分析查询的更多信息。

使用 PROFILE 时,您可能需要多次运行它才能获得最佳值。查询第一次运行时,会在将其放入查询缓存之前完成评估、规划和解释的完整循环。进入缓存后,后续执行时间将得到改善。此外,始终使用参数而不是字面量,以从缓存中获益。

阅读有关执行计划的更多信息,并查看有关如何捕获执行计划的详细步骤指南。

为了最好地解释执行计划的输出,建议您熟悉其中使用的术语。有关更多信息,请参阅执行计划操作符摘要

索引规范

随着数据量的增长,定义约束和索引对于实现查询的最佳性能至关重要。为此,运行时引擎需要评估与查询相关的成本,并且为了获得最佳估计,它将依赖于已存在的索引。这可能会显示执行计划中是否缺少索引,以及缺少哪个索引。虽然在某些情况下,索引可能不可用或不可行,但重新考虑模型并创建中间节点或其他关系类型来利用它也可能是合理的。

阅读有关索引使用的更全面解释。

您还可以通过使用USING子句来微调查询中索引的使用。

查看指标和实例大小

使用 Aura,您可以关注一些关键指标,以查看实例可能遇到哪些资源限制。按照监控中描述的步骤来检查这些信息。

在此阶段,如果关键指标过高,您可能需要重新考虑实例大小。调整大小操作不会导致任何停机,并且您只需为使用的资源付费。

您应该始终根据工作负载活动峰值调整实例大小。

考虑并发性

有时,单个查询本身可能会被优化并运行良好,但操作的大量和并发可能会使您的 Aura 实例不堪重负。

要查看在任何给定时间运行的内容(如果您有长时间运行的查询,这特别有意义),可以使用以下语句并列出正在运行的内容

运行时引擎和 Cypher 版本

执行计划应向您显示为执行查询而选择的运行时。通常,规划器会做出正确的决定,但有时检查其他运行时是否执行得更好是值得的。阅读有关Cypher 运行时的查询调优的更多信息。

要强制调用给定运行时的使用,请在 Cypher 语句前面添加

  • CYPHER runtime=pipelined for pipelined 运行时

  • CYPHER runtime=slotted for slotted 运行时

  • CYPHER runtime=interpreted for interpreted 运行时

如果您有一个没有错误地执行的 Cypher 模式,它也可能在以前的 Cypher 版本上运行。您可以使用这些Cypher 查询选项来控制用于解释查询的版本。

网络和往返成本

使用 Aura 时,务必考虑您所在区域的最佳云,因为物理距离是可实现的网络延迟的直接因素。

当某些事件导致您的应用程序和 Aura 之间的网络中断时,您将受到往返网络延迟的影响,以重新提交查询。使用 Aura 时,这一点尤其重要,因为您需要在将您的实例连接到应用程序时使用事务函数。