2015-04-14 5 views
1

Вот мой запрос:Neo4j - снижение производительности запросов

MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)-[s:AUTHORED]-(a:Author) 
MATCH (l:Language)-[t:USED]->(w:Woka) 
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*') 
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name; 

Первый раз это выполняется результат возвращается в 3,8 секунды. Для второго выполнения через пару минут результат возвращается через 15.1 секунд. Чем больше я выполняю, тем дольше время ответа. Для третьего исполнения время отклика увеличивается, и через несколько мгновений я получаю результаты от 30 до 90 секунд.

Я единственный пользователь этой базы данных (разработки). Никакие данные не добавляются, не удаляются и не изменяются. Никакие индексы не отбрасываются и не создаются. При закрытии двух из трех подключений к базе данных время отклика возвращается к 15 секундам.

Память установлена ​​в 4 ГБ в качестве начального и макс. До 8 ГБ. Сервер имеет общую память 16 ГБ.

Что здесь происходит? Почему время отклика так сильно отличается?

+0

Как вы выполняете свои запросы? –

+0

использование neo4j-оболочка. – LDB

ответ

0

я позаимствовал из других решений, и я изменил Params следующим образом в файле Conf/neo4j.properties (сервер перезагружен после этого):

neostore.nodestore.db.mapped_memory=512M 
neostore.relationshipstore.db.mapped_memory=512M 
neostore.propertystore.db.mapped_memory=512M 
neostore.propertystore.db.strings.mapped_memory=512M 
neostore.propertystore.db.arrays.mapped_memory=512M 

Результаты теперь, в среднем, на 300% быстрее сокращают время от 90 секунд до 30 секунд, и я больше не отсоединяюсь от веб-интерфейса до базы данных.

2

Каков ваш график? Может быть, он выделяет много кучи для кеширования, а затем недостаточно места для запуска запросов без сбора мусора.

Я предполагаю, что ваши отношения - все 1: n, если не добавить WITH distinct p,w,a между двумя матчами.

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

Попробуйте это:

PROFILE 
MATCH (a:Author) 
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*') 
MATCH (p:Publisher)-[:PUBLISHED]->(w:Woka)<-[:AUTHORED]-(a) 
MATCH (l:Language)-[:USED]->(w:Woka) 
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name; 
+0

Попытайтесь предложить свой запрос и вот результаты. То же количество возвращенных строк: 247 строк То же время отклика около 15-16 секунд: 16838 мс Компилятор CYPHER 2.2 Доступ к базе данных: 20687997 Планировщик COST Прогноз | + Фильтр (0) | + Развернуть (Все) (0) | + Фильтр (1) | + Развернуть (Все) (1) | + Фильтр (2) | + Развернуть (Все) (2) | + Фильтр (3) | + NodeByLabelScan – LDB

+0

Более подробной информации, здесь индексы: Индексов ON: Автор (author_id) ОНЛАЙН ON: Автор (author_name) ОНЛАЙН ON: Language (LANGUAGE_ID) ОНЛАЙН ON: Language (имя_язык) ОНЛАЙН ON: Publisher (publisher_id) ОНЛАЙН ON: Издательство (PUBLISHER_NAME) ONLINE ON: Woka (woka_id) ONLINE ON: Woka (author_id) ONLINE ON: Woka (PUBLISHER_ID) ONLINE ON: Woka (LANGUAGE_ID) ONLINE ON: Woka (woka_title) ОНЛАЙН Без ограничений – LDB

+0

neo4j-sh (?) $ MATCH (n: Au thor) return count (n); + ---------- + | count (n) | + ---------- + | 4136805 | + ---------- + 1 строка 3643 мс – LDB

Смежные вопросы