Почему план запроса neo4j без декартовой работы продукта медленнее? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь профилировать запрос в 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;

и получил следующий план выполнения:

enter image description here

с общим количеством попаданий в дБ 10. Профилирование запроса довольно быстрое.

В этот вебинар в 32 минуты,предлагает избежать операций с декартовыми произведениями.В соответствии с этим я преобразовал запрос в следующее:

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;

, что привело к этому плану выполнения:

enter image description here

с общим итогомхиты дБ 11: оно увеличилось.

Теперь профилирование показывает, что декартово произведение исчезло, однако выполнение выглядит намного медленнее, а удары дБ увеличилось.

Почему оно медленнее, хотя исчезло декартово произведение?Какой запрос лучше: тот, у которого нет декартовых произведений, или тот, у которого меньше хитов?Как я могу улучшить свой запрос?

1 Ответ

1 голос
/ 08 июля 2019

Декартовы произведения не всегда плохи. Они МОГУТ быть плохими, если вы не собираетесь создавать декартово произведение (например, MATCH (p:Person), (m:Movie), которое дает вам декартово произведение всех лиц х всех фильмов).

Но когда вы сопоставляете только пару узлов или, как в вашем случае, выполняете поиск двух узлов, где вы ожидаете, что будет только один из них, это совершенно правильно.

Так что все дело в намерении и в том, удивителен ли результат (что это декартово произведение). Декартово произведение 1 x 1 = 1, так что бояться нечего.

...