تجزیه‌وتحلیل اجرای پُرسمان با Query Explain

این صفحه نحوه بازیابی اطلاعات اجرای پُرسمان را هنگام اجرای پُرسمان شرح می‌دهد.

استفاده از Query Explain

از «توضیح پُرسمان» برای درک نحوه اجرای پُرسمان‌هایتان استفاده کنید. این گزارش جزئیاتی ارائه می‌دهد که می‌توانید از آن‌ها برای بهینه‌سازی پُرسمان‌هایتان استفاده کنید.

می‌توانید از Query Explain ازطریق کنسول Firebase یا بااستفاده از کتابخانه‌های کارخواه سرور Firestore استفاده کنید.

کنسول
  1. در کنسول Firebase، به پایگاه‌های داده و فضای ذخیره‌سازی > Firestore > داده‌ها > ویرایشگر پُرسمان بروید.

  2. پُرسمانی را که می‌خواهید اطلاعات اجرای آن را دریافت کنید اجرا کنید.
  3. روی برگه توضیح پُرسمان کلیک کنید تا برونداد تحلیل پُرسمان را ببینید.
Node.js (سرپرست)
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);
جاوا (سرپرست)
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);
}

توضیح دادن حالت‌ها

بسته به آنچه می‌خواهید اشکال‌زدایی کنید، می‌توانید پُرسمانی را با «توضیح پُرسمان» در حالت‌های مختلف اجرا کنید:

  • analyze: پُرسمان را برنامه‌ریزی و اجرا می‌کند. اطلاعات برنامه‌ریز، آمار اجرای زمان اجرا، و سنجه‌ها را در کنار نتایج معمولی تولیدشده توسط پُرسمان برمی‌گرداند.

  • explain: پُرسمان را برنامه‌ریزی می‌کند، اما آن را اجرا نمی‌کند. اطلاعات برنامه‌ریز را برمی‌گرداند اما آمار، سنجه‌ها، یا نتایج زمان اجرا را برنمی‌گرداند. این برای اشکال‌زدایی رفتار پُرسمان بدون اجرای عملیات پرهزینه مفید است.

  • stats: پُرسمان را برنامه‌ریزی و اجرا می‌کند، اما نتایج را برنمی‌گرداند. اطلاعات برنامه‌ریز، آمار اجرای زمان اجرا، و سنجه‌ها را برمی‌گرداند.

Analysis

خروجی 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

حالا چه می‌شود