Функция Query Explain позволяет отправлять запросы Cloud Firestore на серверную часть и получать в ответ подробную статистику производительности выполнения запросов. Она работает аналогично операции EXPLAIN [ANALYZE] во многих реляционных системах баз данных.
Запросы Query Explain можно отправлять с помощью клиентских библиотек сервера Firestore .
Результаты функции Query Explain помогают понять, как выполняются ваши запросы, выявляя неэффективности и места вероятных узких мест на стороне сервера.
Пояснение к запросу:
- Предоставляет информацию об этапе планирования запросов, позволяя корректировать индексы запросов и повышать эффективность.
- Использование функции анализа помогает понять затраты и производительность каждого запроса в отдельности, а также позволяет быстро перебирать различные шаблоны запросов для оптимизации их использования.
Понимание параметров запроса Explain: default и analyze
Операции Query Explain можно выполнять, используя параметр по умолчанию или параметр analyze .
При использовании параметра по умолчанию функция Query Explain планирует запрос, но пропускает этап выполнения. В этом случае будет возвращена информация об этапе планирования. Вы можете использовать это для проверки наличия необходимых индексов в запросе и понимания того, какие индексы используются. Это поможет вам проверить, например, использует ли конкретный запрос составной индекс, а не пересекается со множеством различных индексов.
При использовании опции анализа, инструмент Query Explain планирует и выполняет запрос. Он возвращает всю упомянутую ранее информацию из планировщика, а также статистику выполнения запроса. Это включает в себя информацию о выставлении счетов за запрос, а также системные данные о выполнении запроса. Вы можете использовать этот инструмент для тестирования различных конфигураций запросов и индексов с целью оптимизации их стоимости и задержки.
Сколько стоит услуга 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)"},
]
}Для получения более подробной информации см. справочник по отчету Query Explain .
Используйте функцию Query 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", } } }