Как анализировать выполнение запросов с помощью Query Explain

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

Как использовать Query Explain

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

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

Консоль

Выполните запрос в редакторе запросов и откройте вкладку Explanation (Объяснение).

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

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

  2. В списке баз данных выберите базу данных Cloud Firestore. В консоли Google Cloud откроется Firestore Explorer для этой базы данных.
  3. Введите запрос в редакторе запросов и нажмите Выполнить.
  4. Чтобы посмотреть результаты анализа запроса, перейдите на вкладку Explanation (Интерпретация).

    Вкладка Query Explain (Объяснение запроса) в консоли
MongoDB API

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

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

db.collection.explain('executionStats').find(...)

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

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

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

  • Query Explain поддерживает режимы детализации executionStats, allPlansExecution и queryPlanner.

    • queryPlanner – возвращает только план выполнения, не выполняя запрос.
    • executionStats и allPlansExecution – возвращает план выполнения вместе со статистикой оплаты, памяти и выполнения.

    Если режим не указан, по умолчанию используется queryPlanner. Чтобы посмотреть полную статистику выполнения, укажите режим детализации executionStats или allPlansExecution.

Анализ

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

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

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

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

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

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

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

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

Подробнее о том, как оптимизировать выполнение запросов…

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

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

Tree:
• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 35
|   latency: 204.87 ms (local 7.64 ms)
|
└── • Compute
    |  $__id___1: _id($__key___2)
    |
    |  Execution:
    |   records returned: 35
    |   latency: 197.23 ms (local 2.04 ms)
    |
    └── • MajorSort
        |  fields: [$v_5 ASC]
        |  output: [$__key___2, $record_1]
        |
        |  Execution:
        |   records returned: 35
        |   latency: 195.20 ms (local 28.42 ms)
        |   peak memory usage: 45.56 KiB (46,656 B)
        |
        └── • Compute
            |  $v_5: offset($v_4, 0L)
            |
            |  Execution:
            |   records returned: 35
            |   latency: 166.78 ms (local 14.84 ms)
            |
            └── • Compute
                |  $v_4: sortPaths(array($date_placed_1), [date_placed ASC])
                |
                |  Execution:
                |   records returned: 35
                |   latency: 151.94 ms (local 5.43 ms)
                |
                └── • TableScan
                       source: **/orders
                       order: STABLE
                       filter: $eq($user_id_1, 1,234)
                       output bindings: {$__key___2=row().__key__, $date_placed_1=row().date_placed, $record_1=row[* - { __create_time__, __update_time__ }](), $user_id_1=row().user_id}
                       output: [$__key___2, $date_placed_1, $record_1]

                       Execution:
                        records returned: 35
                        latency: 146.50 ms
                        data bytes returned: 3.25 KiB (3,325 B)
                        post-filtered rows: 230
                        records scanned: 265
                        data bytes read: 24.58 KiB (25,175 B)

Дальнейшие действия