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

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

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

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

شرح الاستعلام:

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

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

يمكن تنفيذ عمليات شرح طلب البحث باستخدام الخيار الافتراضي أو الخيار تحليل.

باستخدام الخيار الافتراضي، يخطط Query Changes (شرح الاستعلام) للاستعلام، ولكنه يتخطى مرحلة التنفيذ. سيؤدي هذا إلى عرض معلومات مرحلة المخطط. ويمكنك استخدام هذا للتحقق من احتواء الاستعلام على الفهارس اللازمة ومعرفة الفهارس المستخدمة. سيساعدك هذا مثلاً في التأكد من أن استعلامًا معينًا يستخدم فهرسًا مركبًا بدلاً من الحاجة إلى التقاطع مع العديد من الفهارس المختلفة.

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

ما تكلفة شرح الاستعلام؟

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

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

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

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

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

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

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

استخدام شرح الاستعلام مع خيار التحليل

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

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

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). وهي تفحص 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",
               }
    }
}