تتيح لك ميزة "شرح الاستعلام" إرسال استعلامات Cloud Firestore إلى الخلفية وتلقّي إحصاءات مفصّلة عن أداء تنفيذ الاستعلام في الخلفية. وهي تعمل مثل عملية EXPLAIN [ANALYZE]
في العديد من أنظمة قواعد البيانات الارتباطية.
يمكن إرسال طلبات Query Explain باستخدام مكتبات برامج خادم Firestore.
تساعدك نتائج "شرح طلب البحث" في فهم طريقة تنفيذ طلبات البحث، إذ تعرض لك أوجه القصور وموقع الاختناقات المحتملة من جهة الخادم.
شرح الطلب:
- تقدّم هذه الصفحة إحصاءات حول مرحلة تخطيط طلب البحث، ما يتيح لك تعديل فهارس طلب البحث وتحسين الكفاءة.
- يساعدك استخدام خيار "التحليل" في فهم التكلفة والأداء على أساس كل طلب بحث، كما يتيح لك تكرار أنماط طلبات البحث المختلفة بسرعة من أجل تحسين استخدامها.
التعرّف على خيارات "شرح طلب البحث": الخيار التلقائي وخيار "تحليل"
يمكن تنفيذ عمليات Query Explain باستخدام الخيار default أو الخيار analyze.
باستخدام الخيار التلقائي، تخطّط أداة Query Explain لطلب البحث، ولكنها تتخطّى مرحلة التنفيذ. سيؤدي ذلك إلى عرض معلومات مرحلة المخطط. يمكنك استخدام هذه الأداة للتأكّد من أنّ طلب البحث يتضمّن الفهارس اللازمة ومعرفة الفهارس المستخدَمة. سيساعدك ذلك في التأكّد، على سبيل المثال، من أنّ طلب بحث معيّن يستخدم فهرسًا مركّبًا بدلاً من الاضطرار إلى البحث عن تقاطع بين العديد من الفهارس المختلفة.
باستخدام خيار "التحليل"، تشرح أداة Query Explain الخطة وتنفّذ طلب البحث. يعرض هذا الأمر جميع معلومات المخطِّط المذكورة سابقًا بالإضافة إلى إحصاءات من وقت تنفيذ طلب البحث. سيشمل ذلك معلومات الفوترة الخاصة بالاستعلام بالإضافة إلى إحصاءات على مستوى النظام حول تنفيذ الاستعلام. يمكنك استخدام هذه الأدوات لاختبار إعدادات مختلفة للاستعلام والفهرس من أجل تحسين التكلفة ووقت الاستجابة.
ما هي تكلفة Query Explain؟
عند استخدام Query Explain مع الخيار التلقائي، لا يتم تنفيذ أي عمليات فهرسة أو قراءة. بغض النظر عن مدى تعقيد طلب البحث، يتم تحصيل رسوم مقابل عملية قراءة واحدة.
عند استخدام Query Explain مع خيار التحليل، يتم تنفيذ عمليات الفهرسة والقراءة، وبالتالي يتم تحصيل رسوم منك مقابل الاستعلام كالمعتاد. لا يتم تحصيل أي رسوم إضافية مقابل نشاط التحليل، بل يتم تحصيل الرسوم المعتادة مقابل تنفيذ طلب البحث فقط.
استخدام "شرح الاستعلام" مع الخيار التلقائي
يمكنك استخدام مكتبات العميل لإرسال طلب خيار تلقائي.
يُرجى العِلم أنّه يتم إثبات صحة الطلبات باستخدام "إدارة الهوية وإمكانية الوصول"، وذلك باستخدام الأذونات نفسها لعمليات طلب البحث العادية. ويتم تجاهل تقنيات المصادقة الأخرى، مثل Firebase Authentication. لمزيد من المعلومات، يُرجى الاطّلاع على الدليل حول إدارة الهوية وإمكانية الوصول (IAM) لمكتبات برامج الخادم والعميل.
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)"}, ] }
لمزيد من المعلومات، اطّلِع على مرجع "شرح الاستعلام".
استخدام Query Explain مع خيار التحليل
يمكنك استخدام مكتبات العميل لإرسال طلب خيار "التحليل".
يُرجى العِلم أنّه يتم إثبات صحة الطلبات باستخدام "إدارة الهوية وإمكانية الوصول"، وذلك باستخدام الأذونات نفسها لعمليات طلب البحث العادية. ويتم تجاهل تقنيات المصادقة الأخرى، مثل Firebase Authentication. لمزيد من المعلومات، يُرجى الاطّلاع على الدليل حول إدارة الهوية وإمكانية الوصول (IAM) لمكتبات برامج الخادم والعميل.
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)
. وهي تفحص 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", } } }