Query Explain を使用してクエリ実行を分析する

このページでは、クエリの実行時にクエリ実行情報を取得する方法について説明します。

クエリ Explain を使用する

Query Explain を使用すると、クエリの実行方法を把握できます。これにより、クエリを最適化するために使用できる詳細情報が提供されます。

Query Explain は、 Google Cloud コンソールまたは Firestore サーバー クライアント ライブラリを使用して使用できます。

コンソール

クエリエディタでクエリを実行し、[説明] タブを開きます。

  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストから Firestore データベースを選択します。 Google Cloud コンソールで、そのデータベースの Firestore エクスプローラが開きます。
  3. クエリエディタにクエリを入力し、[実行] をクリックします。
  4. [説明] タブをクリックして、クエリ分析の出力を表示します。

Node.js(管理)
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(管理)
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: クエリを計画しますが、実行しません。プランナー情報を返しますが、ランタイムの統計情報、指標、結果は返しません。これは、コストのかかるオペレーションを実行せずにクエリの動作をデバッグする場合に役立ちます。

分析

Query Explain の出力には、統計情報の概要と実行ツリーの 2 つの主要コンポーネントが含まれています。次のクエリを例として考えてみましょう。

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

統計情報の概要

Query Explain の出力の上部には、実行統計の概要が表示されます。これらの統計情報を使用して、クエリのレイテンシや費用が高いかどうかを判断します。これには、クエリがメモリ上限にどの程度近づいているかを示すメモリ統計情報も含まれています。

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

次のステップ