Menganalisis eksekusi kueri dengan Query Explain

Halaman ini menjelaskan cara mengambil informasi eksekusi kueri saat Anda menjalankan kueri.

Menggunakan Query Explain

Gunakan Query Explain untuk memahami cara kueri Anda dijalankan. Hal ini memberikan detail yang dapat Anda gunakan untuk mengoptimalkan kueri.

Anda dapat menggunakan Query Explain melalui Google Cloud konsol atau menggunakan library klien server Firestore.

Konsol

Jalankan kueri di Editor Kueri dan buka tab Explanation:

  1. Di Google Cloud konsol, buka halaman Databases.

    Buka Databases

  2. Dari daftar database, pilih database Firestore. Konsol akan membuka Firestore Explorer untuk database tersebut. Google Cloud
  3. Masukkan kueri di editor kueri, lalu klik Run.
  4. Klik tab Explanation untuk melihat output analisis kueri.

Node.js (Admin)
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);
}

Mode penjelasan

Bergantung pada hal yang ingin Anda debug, Anda dapat menjalankan kueri dengan Query Explain dalam mode yang berbeda:

  • analyze: Merencanakan dan menjalankan kueri. Menampilkan informasi perencana, statistik dan metrik eksekusi runtime, beserta hasil reguler yang dihasilkan oleh kueri.

  • explain: Merencanakan kueri, tetapi tidak menjalankannya. Menampilkan informasi perencana, tetapi tidak ada statistik, metrik, atau hasil runtime. Hal ini berguna untuk men-debug perilaku kueri tanpa menjalankan operasi yang mahal.

Analisis

Output Query Explain berisi dua komponen utama, yaitu Statistik Ringkasan dan Hierarki Eksekusi. Pertimbangkan kueri ini sebagai contoh:

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

Statistik Ringkasan

Bagian atas output yang dijelaskan berisi ringkasan statistik eksekusi. Gunakan statistik ini untuk menentukan apakah kueri memiliki latensi atau biaya yang tinggi. Selain itu, tab ini juga berisi statistik memori yang memberi tahu seberapa dekat kueri Anda dengan batas memori.

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

Hierarki Eksekusi

Hierarki eksekusi menjelaskan eksekusi kueri sebagai serangkaian node. Node bawah (node daun) mengambil data dari lapisan penyimpanan yang melintasi hierarki untuk menghasilkan respons kueri.

Untuk mengetahui detail tentang setiap node eksekusi, lihat Referensi eksekusi.

Untuk mengetahui detail cara menggunakan informasi ini guna mengoptimalkan kueri Anda, lihat Mengoptimalkan eksekusi kueri.

Berikut contoh hierarki eksekusi:

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

Langkah berikutnya