تحليل تنفيذ طلب البحث باستخدام Query Explain

توضّح هذه الصفحة كيفية استرداد معلومات تنفيذ طلب البحث عند تنفيذه.

استخدام ميزة "شرح طلب البحث"

يمكنك استخدام ميزة "شرح طلب البحث" لفهم كيفية تنفيذ طلبات البحث. وتوفّر هذه الميزة تفاصيل يمكنك استخدامها لتحسين طلبات البحث.

يمكنك استخدام ميزة "شرح طلب البحث" من خلال Google Cloud Console أو الأمر explain.

وحدة التحكم

نفِّذ طلب بحث في "محرِّر طلب البحث" وافتح علامة التبويب الشرح:

  1. في Google Cloud Console، انتقِل إلى صفحة قواعد البيانات.

    الانتقال إلى "قواعد البيانات"

  2. من قائمة قواعد البيانات، اختَر قاعدة بيانات Cloud Firestore. يفتح Google Cloud Console مستكشف Firestore لقاعدة البيانات هذه.
  3. أدخِل طلب بحث في محرِّر طلب البحث وانقر على تشغيل.
  4. انقر على علامة التبويب الشرح لعرض ناتج تحليل طلب البحث.

    علامة التبويب "شرح طلب البحث" في وحدة التحكّم
واجهة برمجة تطبيقات MongoDB

تتوفّر ميزة "شرح طلب البحث" في واجهة برمجة تطبيقات MongoDB من خلال الـ explain الذي يمكنك استخدامه في أدوات مثل Mongo Shell وCompass.

يتوافق الأمر explain مع الأوامر aggregate وfind وdistinct وcount، على سبيل المثال:

db.collection.explain('executionStats').find(...)

يمكنك أيضًا استخدام الطريقة explain()، على سبيل المثال:

db.collection.find({QUERY}).explain('executionStats')
القيود
يُرجى ملاحظة القيود والاختلافات التالية:
  • لا تتوافق ميزة "شرح طلب البحث" مع الأوامر التي تعرض مؤشرًا. على سبيل المثال، لا يمكن استدعاء ميزة "شرح طلب البحث" من خلال استدعاء الأمر التالي مباشرةً:

    db.collection.aggregate(..., explain: true)
  • لا تتوافق ميزة "شرح طلب البحث" إلا مع الأوامر find, aggregate, count, وdistinct.

  • لا تتوافق خيارات Verbosity وComment في ميزة "شرح طلب البحث" مع واجهة برمجة تطبيقات MongoDB. يتطابق السلوك مع الخيار executionStats. يتم تجاهل الخيارَين allPlansExecution وqueryPlanner إذا تم توفيرهما.

    إذا لم يتم توفير مستوى تفصيل، تستخدم واجهة سطر الأوامر مستوى تفصيل queryPlanner وتفلتر إحصاءات التنفيذ. عليك استخدام مستوى التفصيل executionStats أو allPlansExecution للاطّلاع على الناتج الكامل.

التحليل

يحتوي ناتج ميزة "شرح طلب البحث" على مكوّنَين رئيسيَّين: الإحصاءات الملخّصة وشجرة التنفيذ. لنأخذ طلب البحث هذا كمثال:

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

الإحصاءات الملخّصة

يحتوي الجزء العلوي من الناتج الذي تم شرحه على ملخّص لإحصاءات التنفيذ. استخدِم هذه الإحصاءات لتحديد ما إذا كان طلب البحث يتضمّن وقت استجابة أو تكلفة مرتفعَين. ويحتوي أيضًا على إحصاءات الذاكرة التي تتيح لك معرفة مدى اقتراب طلب البحث من الحدود القصوى للذاكرة.

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

شجرة التنفيذ

تصف شجرة التنفيذ عملية تنفيذ طلب البحث كسلسلة من العُقد. تسترد العُقد السفلية (العُقد الورقية) البيانات من طبقة التخزين التي تنتقل لأعلى الشجرة لإنشاء استجابة لطلب البحث.

للحصول على تفاصيل عن كل عُقدة تنفيذ، يُرجى الرجوع إلى مرجع التنفيذ.

للحصول على تفاصيل حول كيفية استخدام هذه المعلومات لتحسين طلبات البحث، يُرجى الاطّلاع على مقالة تحسين تنفيذ طلب البحث.

في ما يلي مثال على شجرة تنفيذ:

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

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