Sorgu açıklama aracıyla sorgu yürütmeyi analiz etme

Bu sayfada, bir sorgu yürüttüğünüzde sorgu yürütme bilgilerinin nasıl alınacağı açıklanmaktadır.

Sorgu Açıklaması'nı kullanma

Sorgularınızın nasıl yürütüldüğünü anlamak için Query Explain'i kullanın. Bu sayede, sorgularınızı optimize etmek için kullanabileceğiniz ayrıntılar sağlanır.

Query Explain'i Firebase konsolu veya Firestore sunucu istemci kitaplıkları üzerinden kullanabilirsiniz.

Konsol
  1. Firebase konsolunda Veritabanları ve Depolama > Firestore > Veriler > Sorgu Düzenleyici'ye gidin.

  2. Yürütme bilgilerini almak istediğiniz sorguyu çalıştırın.
  3. Sorgu analizi çıkışını görüntülemek için Query Explain (Sorgu Açıklaması) sekmesini tıklayın.
Node.js (Yönetici)
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 (Yönetici)
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);
}

Modları açıklama

Hata ayıklamak istediğiniz şeye bağlı olarak, Query Explain ile farklı modlarda bir sorgu yürütebilirsiniz:

  • analyze: Sorguyu planlar ve yürütür. Sorgu tarafından üretilen normal sonuçların yanı sıra planlayıcı bilgilerini, çalışma zamanı yürütme istatistiklerini ve metrikleri döndürür.

  • explain: Sorguyu planlar ancak yürütmez. Planlayıcı bilgilerini döndürür ancak çalışma zamanı istatistiklerini, metriklerini veya sonuçlarını döndürmez. Bu, maliyetli işlemleri çalıştırmadan bir sorgunun davranışında hata ayıklamak için kullanışlıdır.

  • stats: Sorguyu planlar ve yürütür ancak sonuç döndürmez. Planlayıcı bilgilerini, çalışma zamanı yürütme istatistiklerini ve metrikleri döndürür.

Analiz

Query Explain'in çıkışı iki ana bileşenden oluşur: Özet İstatistikler ve Yürütme Ağacı. Örnek olarak şu sorguyu ele alalım:

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

Özet İstatistikler

Açıklanan çıkışın üst kısmında yürütme istatistiklerinin bir özeti yer alır. Bir sorgunun gecikme süresinin veya maliyetinin yüksek olup olmadığını belirlemek için bu istatistikleri kullanın. Ayrıca sorgunuzun bellek sınırlarına ne kadar yakın olduğunu gösteren bellek istatistiklerini de içerir.

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

Yürütme Ağacı

Yürütme ağacı, sorgu yürütmeyi bir dizi düğüm olarak açıklar. En alttaki düğümler (yaprak düğümler), depolama katmanından veri alır. Bu veriler, sorgu yanıtı oluşturmak için ağaçta yukarı doğru ilerler.

Her bir yürütme düğümüyle ilgili ayrıntılar için Yürütme referansı başlıklı makaleyi inceleyin.

Sorgularınızı optimize etmek için bu bilgileri nasıl kullanacağınızla ilgili ayrıntılı bilgi için Sorgu yürütmeyi optimize etme başlıklı makaleyi inceleyin.

Aşağıda bir yürütme ağacı örneği verilmiştir:

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

Sırada ne var?