فهم أداء طلبات البحث باستخدام شرح طلب البحث

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

يمكن إرسال طلبات Query Explain باستخدام مكتبات برامج خادم Firestore.

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

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

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

التعرّف على خيارات "شرح الاستعلام": الخياران التلقائي والتحليل

يمكن تنفيذ عمليات "شرح الاستعلام" باستخدام الخيار تلقائي أو الخيار تحليل.

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

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

ما هي تكلفة استخدام ميزة "شرح الاستعلام"؟

عند استخدام Query Explain مع الخيار التلقائي، لا يتم تنفيذ أي عمليات فهرسة أو قراءة. بغض النظر عن مدى تعقيد طلب البحث، يتم تحصيل رسوم مقابل عملية قراءة واحدة.

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

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

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

يُرجى العِلم أنّه يتم إثبات صحة الطلبات باستخدام "إدارة الهوية وإمكانية الوصول"، وذلك باستخدام الأذونات نفسها لعمليات طلب البحث العادية. ويتم تجاهل تقنيات المصادقة الأخرى، مثل 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();

    
العقدة (المشرف)

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)"},
    ]
}

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

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

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

يُرجى العِلم أنّه يتم إثبات صحة الطلبات باستخدام &quot;إدارة الهوية وإمكانية الوصول&quot;، وذلك باستخدام الأذونات نفسها لعمليات طلب البحث العادية. ويتم تجاهل تقنيات المصادقة الأخرى، مثل 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();

    
العقدة (المشرف)

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). وهي تفحص 16,500 إدخال في الفهرس، ولكنها تعرض 1,200 مستند فقط.

// 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",
               }
    }
}