我对某些类型的查询有非常有趣的观察。
我的起始查询是:
PROFILE
MATCH (cs:Movie { id: 'm:H01016' }) WITH cs
MATCH (ms:Actor { id: 'a:111' }) WITH cs,ms
MATCH p=((cs)--(x0)--(x1)--(x2)--(ms))
RETURN EXTRACT(n IN nodes(p) | n) SKIP 0 LIMIT 24使用我的数据,它执行141ms
稍微修改一下这个查询
PROFILE
MATCH (cs:Movie { id: 'm:H01016' }) WITH cs
MATCH (ms:Actor { id: 'a:111' }) WITH cs,ms
MATCH p=((cs)--(x0:Director)--(x1)--(x2)--(ms))
RETURN EXTRACT(n IN nodes(p) | n) SKIP 0 LIMIT 24它开始执行7-8秒。我看到的唯一区别是nodehashjoin发生在哪里。
第一个执行计划是:

第二个看起来像这样:

区别是非常明显的。在第一个查询中,我们在两端都有2个扩展,nodehashjoin发生在中间,而在第二个查询中,我们有3个扩展,1个扩展在另一个端,nodehashjoin发生在末尾。在第二次查询时,这3个扩展导致超过一百万分贝的命中。那么,有没有办法指导nodehashjoin必须在哪里发生呢?
下面是执行缓慢的查询的扩展版本。我相信这里面没什么奇怪的。只是nodehashjoin发生在一个不合适的地方:

发布于 2017-08-25 21:35:44
因此,如果您想以某种方式更改查询优化的行为,实际上有一个技巧可以使用。我没有你的数据集来测试它,但是这个子句可以影响你的执行计划。这样,您可以将展开(全部)和筛选器更改为展开( into )运算符:
with * where truehttps://stackoverflow.com/questions/45863482
复制相似问题