Neo4j Cypher - 第一次调用时查询性能慢

Posted

技术标签:

【中文标题】Neo4j Cypher - 第一次调用时查询性能慢【英文标题】:Neo4j Cypher - slow query performance on first call 【发布时间】:2018-01-14 13:09:52 【问题描述】:

我有以下 Cypher 查询:

MATCH (v:Value)-[:CONTAINS]->(hv:HistoryValue) 
WHERE v.id = 13335 
WITH hv 
ORDER BY hv.createDate DESC 
OPTIONAL MATCH (hv)-[:CREATED_BY]->(u:User) WHERE true 
WITH COLLECT(userId: u.id, historyValueId: hv.id, historyValue: hv.originalValue, historyValueDescription: hv.description, historyValueCreateDate: hv.createDate) AS data, count(hv) as count, ceil(toFloat(count(hv)) / 100) as step 
RETURN REDUCE(s = [], i IN RANGE(0, count - 1, CASE step WHEN 0 THEN 1 ELSE step END) | s + data[i]) AS result

在第一次访问冷的 Neo4j 数据库时,此查询运行速度很慢,但第二次和后续调用运行良好。

这是 PROFILE 输出:

有什么方法可以提高这个查询性能(添加适当的索引等等)?

【问题讨论】:

【参考方案1】:

在第一次查询冷数据库时相对较慢的主要原因可能是冷数据库尚未在内存中缓存任何数据。

在启动数据库后立即调用 APOC 过程 apoc.warmup.run可能会使您的“第一次”查询更快。

【讨论】:

【参考方案2】:

通常,第一次查询需要时间来构建执行计划,也许还有其他一些事情(我不确定列表)。如果问题出在每次使用不同的 v.id 运行查询时,对其进行参数化应该会提供更好的性能。

【讨论】:

以上是关于Neo4j Cypher - 第一次调用时查询性能慢的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j Cypher 查询结构和性能优化

Neo4j 使用cypher语言进行查询

如何优化Neo4J Cypher查询?

如何优化 Neo4J Cypher 查询?

Neo4j 第三篇:Cypher查询入门

Neo4j —— Cypher 查询语言