Анализ выполнения запроса с помощью Query Explain

Относится только к версии Cloud Firestore Enterprise.

На этой странице описывается, как получить информацию о выполнении запроса при его выполнении.

Использовать запрос «Объяснение»

Вы можете использовать Query Explain, чтобы понять, как выполняются ваши запросы. Это предоставляет информацию, которую можно использовать для оптимизации запросов .

Вы можете использовать Query Explain через консоль Google Cloud или команду explain .

Консоль

Выполните запрос в редакторе запросов и откройте вкладку «Пояснение» :

  1. В консоли Google Cloud перейдите на страницу Базы данных .

    Перейти к базам данных

  2. В списке баз данных выберите базу данных Cloud Firestore, совместимую с MongoDB. Консоль Google Cloud откроет Firestore Explorer для этой базы данных.
  3. Введите запрос в редакторе запросов и нажмите кнопку Выполнить .
  4. Нажмите вкладку «Пояснение» , чтобы просмотреть результаты анализа запроса.

    Вкладка «Объяснение запроса» в консоли
API MongoDB

Запрос Explain в API MongoDB поддерживается с помощью команды explain , которую можно использовать в таких инструментах, как Mongo Shell и Compass.

Команда explain поддерживается командами aggregate , find , distinct и count , например:

db.collection.explain.find(...)

Вы также можете использовать метод explain() , например:

db.collection.find({QUERY}).explain()
Ограничения
Обратите внимание на следующие ограничения и различия:
  • Query Explain не поддерживает команды, возвращающие курсор. Например, вызов Explain путём прямого вызова следующей команды не поддерживается:

    db.collection.aggregate(..., explain: true)
  • Запрос Explain поддерживается только для команд find , aggregate , count и distinct .

  • Параметры Verbosity и Comment Query Explain не поддерживаются в API MongoDB. Поведение аналогично параметру executionStats . Параметры allPlansExecution и queryPlanner игнорируются, если указаны.

Анализ

Вывод Query Explain содержит два основных компонента: сводную статистику и дерево выполнения. Рассмотрим этот запрос в качестве примера:

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

Сводная статистика

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

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

Дерево исполнения

Дерево выполнения описывает выполнение запроса как последовательность узлов. Нижние узлы (листовые узлы) извлекают данные из уровня хранения, который затем перемещается вверх по дереву для генерации ответа на запрос.

Подробную информацию о каждом узле выполнения см. в справочнике по выполнению .

Подробную информацию об использовании этой информации для оптимизации запросов см. в разделе Оптимизация выполнения запросов .

Ниже приведен пример дерева выполнения:

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

Что дальше?