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

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

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

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

Вы можете использовать Query Explain в консоли Firebase или с помощью клиентских библиотек сервера Firestore.

Консоль
  1. В консоли Firebase выберите Databases and Storage (Базы данных и хранилище) > Firestore > Data (Данные) > Query Editor (Редактор запросов).

  2. Выполните запрос, для которого хотите получить информацию о выполнении.
  3. Чтобы посмотреть результаты анализа запроса, перейдите на вкладку Query Explain (Объяснение запроса).
Node.js (Admin)
import { field } from '@google-cloud/firestore/pipelines';

const q = db.pipeline()
        .collection('/users')
        .sort(field('status').ascending())
        .limit(100);
let results;
try {
    results = await q.execute({
        explainOptions: { mode: 'analyze', outputFormat: 'text' }
    });
} catch (error) {
    console.log(error);
}
const metrics = results?.explainStats?.text;

console.log(metrics);
Java (Admin)
Pipeline q = db.pipeline()
        .collection("/users")
        .sort(field("status").ascending())
        .limit(100);

PipelineExecuteOptions pipelineOpts = new PipelineExecuteOptions().withExplainOptions(
        new ExplainOptions().withExecutionMode(ExplainOptions.ExecutionMode.ANALYZE)
);
Pipeline.Snapshot result = q.execute(pipelineOpts).get();

String metrics = null;
if (result.getExplainStats() != null) {
    metrics = result.getExplainStats().getText();
    System.out.println(metrics);
}

Режимы объяснения

В зависимости от того, что вы хотите отладить, вы можете выполнить запрос с помощью Query Explain в разных режимах:

  • analyze – планирует и выполняет запрос. Возвращает информацию о планировщике, статистику выполнения и показатели, а также обычные результаты, полученные по запросу.

  • explain – планирует запрос, но не выполняет его. Возвращает информацию о планировщике, но не статистику, показатели или результаты выполнения. Это полезно для отладки поведения запроса без выполнения дорогостоящих операций.

  • stats – планирует и выполняет запрос, но не возвращает результаты. Возвращает информацию о планировщике, статистику выполнения и показатели.

Анализ

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

db.pipeline().collection('/users').sort(field("status").ascending()).limit(100)

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

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

Execution:
 results returned: 2
 request peak memory usage: 20.25 KiB (20,736 B)
 data bytes read: 148 B
 entity row scanned: 2

Billing:
 read units: 1

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

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

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

Подробнее о том, как использовать эту информацию для оптимизации запросов…

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

Tree:
• Compute
|  $out_1: map_set($record_1, "__name__", $__name___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 2
|   latency: 5.96 ms (local <1 ms)
|
└── • Compute
    |  $__name___1: map_get($record_1, "__key__")
    |
    |  Execution:
    |   records returned: 2
    |   latency: 5.88 ms (local <1 ms)
    |
    └── • MajorSort
        |  fields: [$v_1 ASC]
        |  output: [$record_1]
        |  limit: 100
        |
        |  Execution:
        |   records returned: 2
        |   latency: 5.86 ms (local <1 ms)
        |   peak memory usage: 20.25 KiB (20,736 B)
        |
        └── • Compute
            |  $v_1: map_get($record_1, "status")
            |
            |  Execution:
            |   records returned: 2
            |   latency: 5.23 ms (local <1 ms)
            |
            └── • TableScan
                   source: /users
                   order: UNDEFINED
                   properties: *
                   row range: (-∞..+∞)
                   output record: $record_1
                   variables: [$record_1]

                   Execution:
                    records returned: 2
                    latency: 4.68 ms
                    records scanned: 2
                    data bytes read: 148 B

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