Как измерить время выполнения запроса MongoDB из Java-приложения

#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. Да, вы правы. Это не фактическое время выполнения. Он также содержит время передачи данных. Таким образом, может возникнуть вопрос: если я попрошу курсор для следующей партии данных — выполняет ли он запрос еще раз или сохраняет все записи и возвращает пользователю пакетами?