#java #mongodb #execution-time
Вопрос:
Я пишу небольшую утилиту для тестирования баз данных. Есть небольшой фрагмент, показывающий, как я выполняю запрос. ( Я использую драйвер java для MongoDB):
long startTime = System.currentTimeMillis();
MongoIterable<Document> execResult = peopleCollection.aggregate(Collections.singletonList(group));
MongoCursor<Document> cursor = execResult.cursor();
while(cursor.hasNext()) {
cursor.next();
}
long endTime = System.currentTimeMillis();
Я хочу правильно измерить время, чтобы иметь надежные тесты. Когда я удаляю цикл while, время сокращается, но он возвращает только первую партию результатов. Выполняется ли запрос полностью, и сервер возвращает результаты в пакетах, или он выполняется в другой раз при получении следующей партии?
На мой взгляд, оба подхода немного ненадежны, и я не могу найти никакой информации о том, как измерить время в Java-приложении.
Я не могу использовать .explain() или ведение журнала сервера для извлечения времени, мне нужно сделать это из Java-приложения. Я искал ответы в стеке, но ничего не нашел.
Заранее спасибо за любую помощь!
Комментарии:
1. Используйте мониторинг команд.
2. Я думаю, что вам нужно определиться с тем, что означает «время выполнения запроса». Когда вы выполняете запрос, возвращающий большое количество строк, база данных не генерирует их все проактивно, а ждет, пока вы действительно не запросите их с помощью курсора. Если вы сделаете «ВЫБРАТЬ * из таблицы» со 100 тысячами строк, он, скорее всего, потратит большую часть времени на возврат строк. Однако, если запрос очень сложный и возвращает только одно целое число, оба раза должно быть больше/меньше в строке.
3. Да, вы правы. Это не фактическое время выполнения. Он также содержит время передачи данных. Таким образом, может возникнуть вопрос: если я попрошу курсор для следующей партии данных — выполняет ли он запрос еще раз или сохраняет все записи и возвращает пользователю пакетами?