首页 > 解决方案 > 为什么 neo4j EXPLAIN 显示数千行带有唯一的过滤器 DISTINCT 节点?

问题描述

这不会一直发生,但是使用完全相同的 dbase(可能还有不同的节点搜索),我的 EXPLAIN 会不断显示数千行,而我只是希望有一个。我错过了什么吗?

例如:

EXPLAIN MATCH (node:Label) 
WHERE node.UniqueID=1 
WITH DISTINCT node  
RETURN node

解释流程

有 11000 条带有该标签的记录,这表明一个正确的开始。但随后过滤器缩小到 1,105,这是没有意义的。DISTINCT 缩小到 1,105,这也没有任何意义。

当我运行查询时,我只得到一个唯一节点。当我运行解释时,结果显示 1105 行。为什么会出现差异?我注意到当这种情况发生时,下游的一切都停止了,所以我认为 Query 做的工作比它需要的要多,但我不知道为什么。我将非常感谢指向可以更好地解释这一点的资源的指针。

蒂亚!!

标签: neo4j

解决方案


这些是在查询执行之前计算的估计行,它不代表执行中的实际行(您可以使用 PROFILE 来查看)。

估计的行正是如此,通过考虑通过统计数据和来自计数存储的数据从图中知道的内容来估计。

由于这些是在执行之前计算的,因此规划器不知道用于查找的属性的特殊性。

如果你真的有一个唯一的 ID,那么你应该在它上面创建一个唯一的约束,这样规划者就能够理解它并产生一个更有用的估计。它还能够利用索引(带有唯一约束)来提高查找速度。

同样通过这样的更改,您将不再需要使用 DISTINCT,因为唯一索引查找可以保证这一点。


推荐阅读