【问题标题】:Why is the neo4j query plan without cartesian product operation slower?为什么没有笛卡尔积运算的neo4j查询计划比较慢?
【发布时间】:2019-07-08 13:37:16
【问题描述】:

我正在尝试在 Neo4j Cypher 中分析查询。

我从这个查询开始:

PROFILE MATCH (t1:Trip{Direction:1, Route:"01"}),(t2:Trip{Direction:0, Route:"01"})
WITH t1, t2 LIMIT 1
MATCH p4 = (t2)−[:STARTS|STOPS|ENDS]−>(:BusStop), p3=(t1)−[:STARTS|STOPS|ENDS]−(:BusStop)
RETURN p3, p4;

我得到以下执行计划:

总 db hits 为 10。查询的分析速度非常快。

在第 32 分钟的 this webinar 中,建议避免笛卡尔积运算。据此,我将查询转换为以下内容:

PROFILE MATCH (t1:Trip{Direction:1, Route:"01"})
WITH t1 LIMIT 1
MATCH (t2:Trip{Direction:0, Route:"01"})
WITH t1, t2 LIMIT 1
RETURN t1, t2;

导致这个执行计划:

总 db hits 为 11:增加了。

现在分析显示笛卡尔积消失了,但执行似乎要慢得多,并且 db hits 增加了。

为什么笛卡尔积消失了却变慢了? 哪个查询更好:没有笛卡尔积的查询或 db hits 较少的查询?如何改进我的查询?

【问题讨论】:

    标签: neo4j cypher profiling graph-databases cartesian-product


    【解决方案1】:

    笛卡尔积并不总是坏的。如果您不打算创建笛卡尔积(例如 MATCH (p:Person), (m:Movie),它为您提供所有人 x 所有电影的笛卡尔积),它们可能会很糟糕。

    但是,当您只匹配几个节点时,或者在您的情况下,查找两个节点,而您只希望每个节点只有一个,这是完全正确的做法。

    因此,这完全取决于意图以及结果(即它是笛卡尔积)是否令人意外。 1 x 1 = 1 的笛卡尔积,所以没什么好害怕的。

    【讨论】:

    • 忽略估计的行,这些对您没有多大帮助。这些对于规划者来说就像是大致数字,它处理的估计数量级非常广泛。而是查看 PROFILE 中运算符之间的实际行。
    猜你喜欢
    • 2015-04-22
    • 2011-03-24
    • 2017-03-07
    • 2011-11-11
    • 1970-01-01
    • 2013-04-20
    • 2021-11-19
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多