Функция Query Explain позволяет отправлять запросы Cloud Firestore на серверную часть и получать в ответ подробную статистику производительности выполнения запросов. Она работает аналогично операции EXPLAIN [ANALYZE] во многих реляционных системах баз данных.
Запросы Query Explain можно отправлять с помощью клиентских библиотек сервера Firestore .
Результаты функции Query Explain помогают понять, как выполняются ваши запросы, выявляя неэффективности и места вероятных узких мест на стороне сервера.
Пояснение к запросу:
- Предоставляет информацию об этапе планирования запросов, позволяя корректировать индексы запросов и повышать эффективность.
- Использование функции анализа помогает понять затраты и производительность каждого запроса в отдельности, а также позволяет быстро перебирать различные шаблоны запросов для оптимизации их использования.
Понимание параметров запроса Explain: default и analyze
Операции Query Explain можно выполнять, используя параметр по умолчанию или параметр analyze .
With the default option, Query Explain plans the query, but skips over the execution stage. This will return planner stage information. You can use this to check that a query has the necessary indexes and understand which indexes are used. This will help you to verify, for example, that a particular query is using a composite index over having to intersect over many different indexes.
With the analyze option, Query Explain both plans and executes the query. This returns all the previously mentioned planner information along with statistics from the query execution runtime. This will include the billing information of the query along with system-level insights into the query execution. You can use this tooling to test various query and index configurations to optimize their cost and latency.
Сколько стоит услуга Query Explain?
При использовании команды Query Explain с параметром по умолчанию операции индексирования или чтения не выполняются. Независимо от сложности запроса, оплачивается одна операция чтения.
При использовании функции Query Explain с опцией analyze выполняются операции индексирования и чтения, поэтому плата за запрос взимается как обычно. Дополнительная плата за анализ не взимается, взимается только обычная плата за выполнение запроса.
Используйте функцию Query Explain с параметрами по умолчанию.
Вы можете использовать клиентские библиотеки для отправки запроса на выбор параметра по умолчанию.
Обратите внимание, что запросы аутентифицируются с помощью IAM, используя те же разрешения, что и для обычных операций запроса. Другие методы аутентификации, такие как Firebase Authentication , игнорируются. Для получения дополнительной информации см. руководство по IAM для серверных клиентских библиотек .
Java (Администратор)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
Узел (Администратор)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
Точный формат ответа зависит от среды выполнения. Возвращаемые результаты могут быть преобразованы в формат JSON. Например:
{
"indexes_used": [
{"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
{"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
]
}For more information, see the Query Explain report reference .
Используйте запрос Explain с опцией анализа.
Вы можете использовать клиентские библиотеки для отправки запроса на анализ параметров.
Обратите внимание, что запросы аутентифицируются с помощью IAM, используя те же разрешения, что и для обычных операций запроса. Другие методы аутентификации, такие как Firebase Authentication , игнорируются. Для получения дополнительной информации см. руководство по IAM для серверных клиентских библиотек .
Java (Администратор)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();
Узел (Администратор)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'true' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;
В следующем примере показан объект stats , возвращаемый в дополнение к planInfo . Точный формат ответа зависит от среды выполнения. Пример ответа представлен в формате JSON.
{
"resultsReturned": "5",
"executionDuration": "0.100718s",
"readOperations": "5",
"debugStats": {
"index_entries_scanned": "95000",
"documents_scanned": "5"
"billing_details": {
"documents_billable": "5",
"index_entries_billable": "0",
"small_ops": "0",
"min_query_cost": "0",
}
}
}Для получения более подробной информации см. справочник по отчету Query Explain .
Проанализируйте результаты и внесите корректировки.
Рассмотрим пример сценария, в котором мы запрашиваем информацию о фильмах по жанру и стране производства.
Для наглядности предположим, что следующий SQL-запрос эквивалентен следующему.
SELECT * FROM /movies WHERE category = 'Romantic' AND country = 'USA';
Если использовать опцию анализа, возвращаемые метрики показывают, что запрос выполняется на двух однопольных индексах: (category ASC, __name__ ASC) и (country ASC, __name__ ASC) . Он сканирует 16500 записей индекса, но возвращает только 1200 документов.
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"}, ] } // Output query status { "resultsReturned": "1200", "executionDuration": "0.118882s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "16500", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
Для оптимизации производительности выполнения запроса можно создать составной индекс с полным покрытием (category ASC, country ASC, __name__ ASC) .
Повторный запуск запроса с опцией анализа показывает, что для этого запроса выбран вновь созданный индекс, и запрос выполняется значительно быстрее и эффективнее.
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, country ASC, __name__ ASC)"} ] } // Output query stats { "resultsReturned": "1200", "executionDuration": "0.026139s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "1200", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }