تحليل تنفيذ طلب البحث باستخدام 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);
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: يضع خطة لتنفيذ طلب البحث، ولكن لا ينفّذه. تعرض هذه السمة معلومات أداة التخطيط ولكن بدون إحصاءات أو مقاييس أو نتائج وقت التشغيل. ويفيد ذلك في تصحيح أخطاء سلوك طلب البحث بدون تنفيذ عمليات مكلفة.

  • 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

الخطوات التالية