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

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

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

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

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

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

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

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

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

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

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

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

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

استخدام Query Explain مع الخيار التلقائي

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

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

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

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

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

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

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

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