2015-07-26 2 views
1

Тестирование запросов ответов Время возвращает интересные результаты:Neo4j запросы времени отклика

  1. При выполнении того же запрос в несколько раза подряда, в первое время отклика поправиться до определенного момента, то в каждом Execute он получает немного медленнее или прыгает непоследовательно.
  2. Выполнение того же запроса при использовании USING INDEX и в других случаях без использования USING INDEX возвращает почти тот же диапазон времени ответа (как описано в разделе 1), хотя профиль становится лучше (меньше удалений db при использовании ИСПОЛЬЗОВАНИЕ ИНДЕКСА).
  3. Отбрасывание индекса и повторное выполнение запроса возвращает тот же профиль, что и выполнение запроса, в то время как индекс существует, но запрос выполняется без USING INDEX.

Есть объяснение приведенным выше результатам?

Что будет лучшим способом узнать, был ли улучшен запрос, хотя, хотя удары db улучшаются, время отклика нет?

+0

Возможно, вы можете поделиться своими данными, запросом и профилем. Затем мы можем помочь вам объяснить результаты. Существует ряд факторов, влияющих на время выполнения. –

ответ

1

Лучшим способом понять, как выполняется запрос, является, вероятно, использование команды PROFILE, которая фактически объяснит, как работает база данных при выполнении запроса. Это должно дать вам отзывы о том, что cypher делает с подсказками USING INDEX. Вы также можете сравнить различные формулировки одного и того же запроса, чтобы увидеть, какой результат меньше, чем dbHits.

Вероятно, нет исчерпывающего ответа на вопрос, почему запрос принимает переменное количество времени в различных ситуациях. Вы не предоставили свою модель, свои данные или свои запросы. Это зависит от целого множества факторов за пределами вашего запроса, например, вашей модели данных, вашего cache settings, независимо от того, есть ли или нет JVM decides to garbage collect at certain points, насколько полная ваша куча, какие индексы у вас есть (используете ли вы USING INDEX подсказки) - и это только факторы на уровне neo4j/java. На уровне ОС есть много других возможностей/непредвиденных обстоятельств, которые затрудняют точное измерение производительности.

В целом, когда меня беспокоят эти вещи, я нахожу, что полезно собрать большой образец данных (выполнить запрос 10,0000 раз), а затем взять среднее значение. Все факторы, которые находятся вне вашего контроля, как правило, усредняются в подобном образце, но если вы ищете конкретное предсказание того, как долго этот следующий запрос будет идти, вплоть до миллисекунд, это может не быть реалистично возможным.

+0

Спасибо FrobberOfBits! Как вы сказали, я использую команду PROFILE. Проблема заключалась в том, что я не мог сказать, действительно ли тот факт, что есть меньше удалений db (и лучшие планы выполнения), соответствует более быстрому запросу. Из вашего опыта, могу ли я рассчитывать на него, несмотря на непротиворечивое время отклика? Также играется с кешем в файле neo4j.properties, который переключается между мягким, но не видит различий только при запуске запроса в первый раз после перезапуска сервера neo4j. В дальнейшем я буду проверять JVM. В среднем это отличная идея, время ответа указано в журнале? – Eyal

+0

Это зависит от того, что вы подразумеваете под последовательным. Предположим, что запрос обычно занимает 500 мс. Я думаю, вы никогда не получите последовательно 500 мс. Может быть, это будет типично видеть что-нибудь в диапазоне 300-600, причем отдельные выбросы намного больше или меньше. Поэтому в этом смысле я не думаю, что вам следует ожидать согласованности. Но если запрос займет 500 мс, и вы получите что-то дико отличающееся с очень большим диапазоном времени выполнения, это было бы странно.Но опять же, это будет зависеть от ваших данных, вашего плана запросов и от того, что еще делает ваша машина. – FrobberOfBits

+0

Время выполнения не отображается в журналах AFAIK. Это то, что вы должны построить простой скрипт для измерения. – FrobberOfBits

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