Подтвердить что ты не робот

Mongodb: как я могу увидеть время выполнения для агрегатной команды?

Я выполняю следующую команду mongodb в оболочке mongo

db.coll.aggregate(...)

и я вижу список результатов. но можно ли увидеть запрос время исполнения? Существует ли эквивалентная функция для метода объяснения для запросов агрегирования.

4b9b3361

Ответ 1

Я напишу ответ, чтобы объяснить это лучше.

В принципе функциональность explain() для структуры агрегации пока отсутствует: https://jira.mongodb.org/browse/SERVER-4504

Однако есть способ измерения стороны клиента, но не без его недостатков:

  • Вы не измеряете базу данных
  • Вы измеряете приложение
  • Слишком много неизвестных о деталях между деталями, чтобы иметь возможность получить точное чтение, т.е. вы не можете сказать, что для результата документа потребовалось 0,04 мс, чтобы он был сформулирован сервером MongoDB, сериализован, отправлен по провод, де-сериализованный приложением, а затем сохраненный в хэш, позволяющий вычесть эту сумму из общей суммы, чтобы получить контрольный показатель агрегации.

Как бы то ни было, вы можете получить немного точный результат, выполнив его в консоли MongoDB на том же сервере, что и mongos/mongod. Это создаст очень мало в betweens, все еще слишком много, но достаточно, чтобы, возможно, получить чтение, которое вы могли бы доверять. Таким образом, вы можете использовать ответ @Zagorulkin в этом положении.

Ответ 2

var before = new Date()
#aggregation query
var after = new Date()
execution_mills = after - before

Ответ 3

Я вижу, что в mongodb есть возможность использовать эту две команды:

  • db.setProfilingLevel(2)

  • и поэтому после запроса вы можете использовать db.system.profile.find(), чтобы увидеть время выполнения запроса и другие

Ответ 4

Вы можете добавить функцию time в свой .mongorc.js файл (в вашем домашнем каталоге):

function time(command) {
    const t1 = new Date();
    const result = command();
    const t2 = new Date();
    print("time: " + (t2 - t1) + "ms");
    return result; 
}

а затем вы можете использовать его так:

time(() => db.coll.aggregate(...))

Внимание

Этот метод не дает соответствующих результатов для db.collection.find()

Ответ 5

Или вы можете установить отличный mongo-hacker, который автоматически умножает каждый запрос, pretty() отталкивает его, раскрашивает вывод, сортирует ключи и многое другое:

enter image description here

Ответ 6

Попробуйте .explain("executionStats"):

db.inventory.find(
   { quantity: { $gte: 100, $lte: 200 } }
).explain("executionStats")

Что возвращает очень подробный JSON со временем в "executionTimeMillis", например:

{
   "queryPlanner" : {
         ...
   },
   "executionStats" : {
      "executionSuccess" : true,
      "nReturned" : 3,
      "executionTimeMillis" : 0,
      ...

Подробнее: https://docs.mongodb.com/manual/tutorial/analyze-query-plan/#evaluate-the-performance-of-a-query