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

تتيح لك ميزة "شرح طلب البحث" إرسال Cloud Firestore طلبات بحث إلى الخلفية وتلقّي إحصاءات مفصّلة عن الأداء بشأن تنفيذ طلب البحث في الخلفية. وتعمل هذه الميزة على غرار عملية EXPLAIN [ANALYZE] في العديد من أنظمة قواعد البيانات الارتباطية.

يمكن إرسال طلبات "شرح طلب البحث" باستخدام مكتبات عملاء خادم Firestore.

تساعدك نتائج "شرح طلب البحث" في فهم كيفية تنفيذ طلبات البحث، ما يوضّح لك أوجه عدم الكفاءة وموقع الاختناقات المحتملة من جهة الخادم.

شرح طلب البحث:

  • يقدّم إحصاءات عن مرحلة تخطيط طلب البحث، ما يتيح لك تعديل فهارس طلب البحث وتعزيز الكفاءة.
  • يساعدك استخدام خيار التحليل في فهم التكلفة والأداء على أساس كل طلب بحث، ويسمح لك بالتكرار بسرعة من خلال أنماط طلبات بحث مختلفة من أجل تحسين استخدامها.

فهم خيارات "شرح طلب البحث": الخياران التلقائي والتحليل

يمكن إجراء عمليات "شرح طلب البحث" باستخدام الخيار التلقائي أو خيار التحليل.

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

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

ما هي تكلفة ميزة "شرح طلب البحث"؟

عند استخدام ميزة "شرح طلب البحث" مع الخيار التلقائي، لا يتم إجراء أي عمليات فهرسة أو قراءة. وبغض النظر عن مدى تعقيد طلب البحث، يتم تحصيل رسوم عملية قراءة واحدة.

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

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

يمكنك استخدام مكتبات العملاء لإرسال طلب باستخدام الخيار التلقائي.

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

Java (المشرف)

Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();

    
Node (المشرف)

const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;

    

يعتمد التنسيق الدقيق للاستجابة على بيئة التنفيذ. ويمكن تحويل النتائج المعروضة إلى JSON. على سبيل المثال:

{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

لمزيد من المعلومات، يُرجى الاطّلاع على مرجع تقرير "شرح طلب البحث".

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

يمكنك استخدام مكتبات العملاء لإرسال طلب باستخدام خيار التحليل.

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

Java (المشرف)

Query q = db.collection("col").whereGreaterThan("a", 1);

ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();

ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();

    
Node (المشرف)

const q = db.collection('col').where('country', '=', 'USA');

const options = { analyze : 'true' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;

    

يعرض المثال التالي عنصر stats الذي يتم عرضه بالإضافة إلى planInfo. يعتمد التنسيق الدقيق للاستجابة على بيئة التنفيذ. الاستجابة في المثال بتنسيق JSON.

{
    "resultsReturned": "5",
    "executionDuration": "0.100718s",
    "readOperations": "5",
    "debugStats": {
               "index_entries_scanned": "95000",
               "documents_scanned": "5"
               "billing_details": {
                     "documents_billable": "5",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }

}

لمزيد من المعلومات، يُرجى الاطّلاع على مرجع تقرير "شرح طلب البحث".

تفسير النتائج وإجراء التعديلات

لنلقِ نظرة على سيناريو مثال نطلب فيه الأفلام حسب النوع وبلد الإنتاج.

للتوضيح، لنفترض أنّ هذا طلب بحث SQL مكافئ.

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

إذا استخدمنا خيار التحليل، ستعرض المقاييس المعروضة أنّ طلب البحث يتم تنفيذه على فهرسَين يتضمّنان حقل واحد، وهما (category ASC, __name__ ASC) و(country ASC, __name__ ASC). ويتم فحص 16500 إدخال فهرس، ولكن يتم عرض 1200 مستند فقط.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

// Output query status
{
    "resultsReturned": "1200",
    "executionDuration": "0.118882s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "16500",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}

لتحسين أداء تنفيذ طلب البحث، يمكنك إنشاء فهرس مركّب مغطّى بالكامل (category ASC, country ASC, __name__ ASC).

عند تنفيذ طلب البحث باستخدام خيار التحليل مرة أخرى، يمكننا ملاحظة أنّه يتم اختيار الفهرس الذي تم إنشاؤه حديثًا لهذا الطلب، ويتم تنفيذ طلب البحث بشكل أسرع وأكثر كفاءة.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, country ASC,  __name__ ASC)"}
    ]
}

// Output query stats
{
    "resultsReturned": "1200",
    "executionDuration": "0.026139s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "1200",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}