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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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