В этой статье рассказывается, как получить информацию о выполнении запроса.
Как использовать Query Explain
Вы можете использовать Query Explain, чтобы понять, как выполняются ваши запросы. Эта информация поможет вам оптимизировать запросы.
Вы можете использовать Query Explain в консоли Google Cloud или с помощью команды explain.
Консоль
Выполните запрос в редакторе запросов и откройте вкладку Explanation (Объяснение).
-
В консоли Google Cloud перейдите на страницу Databases (Базы данных).
- В списке баз данных выберите базу данных Cloud Firestore. В консоли Google Cloud откроется Firestore Explorer для этой базы данных.
- Введите запрос в редакторе запросов и нажмите Выполнить.
-
Чтобы посмотреть результаты анализа запроса, перейдите на вкладку Explanation (Интерпретация).
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)
Дальнейшие действия
- Подробнее об узлах дерева выполнения…
- Подробнее о том, как оптимизировать выполнение запросов…