Neo4j - почему профилировщик показывает только 2000003 дБ в случае полного сканирования узлов? - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы понять, почему профилировщик запросов показывает только 2000003 дБ обращений. В конце концов, запрос требует полного сканирования на узлах.

Мой вопрос касается следующего запроса:

WITH ["Jennifer","Michelle","Tanya","Julie","Christie","Sophie","Amanda","Khloe","Sarah","Kaylee"] AS names 
    FOREACH (r IN range(0,1000000) | CREATE (:LabelA {username:names[r % size(names)]+r}))

WITH ["Jennifer","Michelle","Tanya","Julie","Christie","Sophie","Amanda","Khloe","Sarah","Kaylee"] AS names 
    FOREACH (r IN range(0,1000000) | CREATE (:LabelA:LabelB {username:names[r % size(names)]+r}))

WITH ["Jennifer","Michelle","Tanya","Julie","Christie","Sophie","Amanda","Khloe","Sarah","Kaylee"] AS names 
    FOREACH (r IN range(0,1000000) | CREATE (:LabelB {username:names[r % size(names)]+r}))

MATCH (n:LabelA:LabelB) RETURN COUNT(n)

Создает 3000003 узлов. Таким образом, чтобы посчитать количество узлов с определенными метками, мы должны выполнить полное сканирование, поэтому 3000003 дБ попаданий. Тем не менее, профили показывают, что на первом этапе требуется 2000003 дБ. Как это возможно?

Заимствовано из:

https://maxdemarzi.com/2017/10/25/counting-nodes-with-multiple-labels/

1 Ответ

0 голосов
/ 04 мая 2018

Метки автоматически индексируются. Для меток LA и LB это означает, что Neo4j внутренне имеет список всех узлов с меткой LA и еще один список всех узлов с меткой LB.

Таким образом, при полном сканировании нужно сканировать только эти 2 индекса. И действительно, нужно только отсканировать один из них и проверить каждый узел на наличие второй метки.

Кроме того, «удар по БД» на самом деле не является чтением из базы данных. На самом деле это абстрактная «единица времени базы данных». Так что относитесь к нему как к общему показателю используемого времени ввода-вывода системы. (Это особенно заметно в сложных запросах со сложными фильтрами. Например, сопоставление подстрок или поиск какого-либо свойства node.property со значением 'x') (https://neo4j.com/docs/developer-manual/current/cypher/execution-plans/#execution-plans-dbhits)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...