提高 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 查询。阅读有关分析查询的更多信息。
使用 |
为了最好地解释执行计划的输出,建议您熟悉其中使用的术语。有关更多信息,请参阅执行计划操作符摘要。
查看指标和实例大小
使用 Aura,您可以关注一些关键指标,以查看实例可能遇到哪些资源限制。按照监控中描述的步骤来检查这些信息。
在此阶段,如果关键指标过高,您可能需要重新考虑实例大小。调整大小操作不会导致任何停机,并且您只需为使用的资源付费。
您应该始终根据工作负载活动峰值调整实例大小。 |
考虑并发性
有时,单个查询本身可能会被优化并运行良好,但操作的大量和并发可能会使您的 Aura 实例不堪重负。
要查看在任何给定时间运行的内容(如果您有长时间运行的查询,这特别有意义),可以使用以下语句并列出正在运行的内容
运行时引擎和 Cypher 版本
执行计划应向您显示为执行查询而选择的运行时。通常,规划器会做出正确的决定,但有时检查其他运行时是否执行得更好是值得的。阅读有关Cypher 运行时的查询调优的更多信息。
要强制调用给定运行时的使用,请在 Cypher 语句前面添加
-
CYPHER runtime=pipelined
forpipelined
运行时 -
CYPHER runtime=slotted
forslotted
运行时 -
CYPHER runtime=interpreted
forinterpreted
运行时
如果您有一个没有错误地执行的 Cypher 模式,它也可能在以前的 Cypher 版本上运行。您可以使用这些Cypher 查询选项来控制用于解释查询的版本。
网络和往返成本
使用 Aura 时,务必考虑您所在区域的最佳云,因为物理距离是可实现的网络延迟的直接因素。
当某些事件导致您的应用程序和 Aura 之间的网络中断时,您将受到往返网络延迟的影响,以重新提交查询。使用 Aura 时,这一点尤其重要,因为您需要在将您的实例连接到应用程序时使用事务函数。