neo4j - 为什么 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 做的工作比它需要的要多,但我不知道为什么。我将非常感谢指向可以更好地解释这一点的资源的指针。
蒂亚!!
解决方案
这些是在查询执行之前计算的估计行,它不代表执行中的实际行(您可以使用 PROFILE 来查看)。
估计的行正是如此,通过考虑通过统计数据和来自计数存储的数据从图中知道的内容来估计。
由于这些是在执行之前计算的,因此规划器不知道用于查找的属性的特殊性。
如果你真的有一个唯一的 ID,那么你应该在它上面创建一个唯一的约束,这样规划者就能够理解它并产生一个更有用的估计。它还能够利用索引(带有唯一约束)来提高查找速度。
同样通过这样的更改,您将不再需要使用 DISTINCT,因为唯一索引查找可以保证这一点。
推荐阅读
- mongodb - db$distinct 将结果作为 [array] 而不是列表?
- c# - wpf datagrid中的独特列样式
- python - 添加节点后将 XML 树漂亮打印到文件
- python - 将类的绑定方法存储并应用为变量?
- graphql - 如何在 apollo-angular 查询 Promise 中获取网络错误
- javascript - 有没有办法从 javascript 运行命令行实用程序?
- javascript - 找不到正确的函数调用
- c - 二叉树代码适用于 Linux,但不适用于 Windows 10
- sql-server - ASP.NET Core EF 返回带有动态列的 DTO
- c# - 即使应用程序在c#的后台,我如何检测按键何时开始和结束