لتحديد المشاكل وحلّها في طلبات البحث البطيئة، استخدِم أداة "شرح طلب البحث" للحصول على خطة تنفيذ طلب البحث وملف تنفيذ وقت التشغيل. يوضّح القسم التالي الخطوات التي يمكنك اتّخاذها لتحسين أداء طلب البحث استنادًا إلى ملف التنفيذ:
الحدّ من عدد النتائج
استخدِم حقل السجلات المعروضة في شجرة التنفيذ لتحديد ما إذا كان طلب البحث يعرض مستندات كثيرة. يمكنك الحدّ من عدد المستندات المعروضة باستخدام مرحلة limit(...). يقلّل ذلك من حجم البايت المتسلسل للنتائج عند عرضها للعملاء عبر الشبكة. في الحالات التي يسبق فيها العقدة Limit العقدة MajorSort، يمكن لمحرك طلب البحث دمج العقدتَين Limit وMajorSort واستبدال عملية التجسيد والترتيب الكاملتَين في الذاكرة بعملية ترتيب TopN، ما يقلّل من متطلبات الذاكرة لطلب البحث.
الحدّ من حجم مستند النتائج
يمكنك الحدّ من حجم المستند المعروض باستخدام select(...) لعرض الحقول المطلوبة فقط أو remove_fields(...) لإزالة الحقول الكبيرة جدًا. يساعد ذلك في تقليل تكلفة الحوسبة والذاكرة لمعالجة النتائج الوسيطة وحجم البايت المتسلسل للنتائج عند عرضها للعملاء عبر الشبكة. في الحالات التي يغطي فيها فهرس عادي جميع الحقول المشار إليها في طلب البحث، يسمح ذلك أيضًا بأن يغطي الفهرس طلب البحث بالكامل من خلال عملية فحص الفهرس، ما يجنّب الحاجة إلى جلب المستندات من وحدة التخزين الأساسية.
استخدام الفهارس
استخدِم التعليمات التالية لإعداد الفهارس وتحسينها.
تحديد ما إذا كان طلب البحث يستخدم فهرسًا
يمكنك تحديد ما إذا كان طلب البحث يستخدم فهرسًا من خلال التحقّق من العُقد الورقية في شجرة التنفيذ. إذا كانت العقدة الورقية لشجرة التنفيذ هي العقدة TableScan، يعني ذلك أنّ طلب البحث لا يستخدم فهرسًا ويجري فحصًا للمستندات من وحدة التخزين الأساسية. إذا كان يتم استخدام فهرس، ستعرض العقدة الورقية لشجرة التنفيذ رقم تعريف الفهرس وحقول الفهرس.
تحديد فهرس أفضل
يكون الفهرس مفيدًا لطلب البحث إذا كان بإمكانه تقليل عدد المستندات التي يحتاج محرك طلب البحث إلى جلبها من وحدة التخزين الأساسية أو إذا كان ترتيب الحقول فيه يمكن أن يلبّي متطلبات الترتيب لطلب البحث.
إذا تم استخدام فهرس لطلب بحث، ولكن كان محرك طلب البحث لا يزال يجلب العديد من المستندات ويتجاهلها، كما هو محدّد من خلال العقدة Scan التي تعرض العديد من السجلات متبوعة بالعقدة Filter التي تعرض عددًا قليلاً من السجلات، فهذا يشير إلى أنّ دالة طلب البحث التي تم استيفاؤها باستخدام الفهرس ليست انتقائية. لإنشاء فهرس أكثر ملاءمة، اطّلِع على مقالة إنشاء الفهارس.
إذا تم استخدام فهرس لطلب بحث، ولكن كان محرك طلب البحث لا يزال يجري عملية إعادة ترتيب لمجموعة النتائج في الذاكرة، كما هو محدّد من خلال العقدة MajorSort في شجرة تنفيذ طلب البحث، فهذا يشير إلى أنّه لا يمكن استخدام الفهرس المستخدَم لتلبية متطلبات الترتيب لطلب البحث. لإنشاء فهرس أكثر ملاءمة، اطّلِع على القسم التالي.
إنشاء الفهارس
اتّبِع مستندات إدارة الفهارس لـ إنشاء الفهارس. لضمان إمكانية استخدام طلب البحث للفهارس، أنشئ فهارس عادية (غير فهارس Multikey) تتضمّن حقولاً بالترتيب التالي:
- جميع الحقول التي سيتم استخدامها في عوامل تشغيل المساواة. لتحقيق أقصى قدر من فرص إعادة الاستخدام في طلبات البحث، رتِّب الحقول بترتيب تنازلي حسب عدد مرات ظهور الحقول في عوامل تشغيل المساواة بين طلبات البحث.
- جميع الحقول التي سيتم ترتيبها (بالترتيب نفسه).
- الحقول التي سيتم استخدامها في عوامل تشغيل النطاق أو عدم المساواة بترتيب تنازلي حسب مدى انتقائية قيود طلب البحث.
- الحقول التي سيتم عرضها كجزء من طلب بحث في الفهرس: إنّ تضمين هذه الحقول في الفهرس يسمح للفهرس بتغطية طلب البحث وتجنُّب الحاجة إلى جلب المستند من وحدة التخزين الأساسية.
فرض عملية فحص الفهرس أو الجدول
عند طلب بيانات من Cloud Firestore، يستخدم تلقائيًا أي فهارس من المرجّح أن تجعل طلب البحث أكثر كفاءةً. نتيجةً لذلك، ما عليك تحديد فهرس لطلبات البحث. ومع ذلك، بالنسبة إلى طلبات البحث الضرورية لعبء العمل، ننصحك باستخدام الخيار forceIndex للحصول على أداء أكثر اتساقًا.
في حالات قليلة، قد يختار Cloud Firestore فهرسًا يؤدي إلى زيادة وقت استجابة طلب البحث. إذا اتّبعت خطوات تحديد المشاكل وحلّها في حالات تراجع الأداء وأكّدت أنّه من المنطقي تجربة فهرس مختلف لطلب البحث، يمكنك تحديد الفهرس باستخدام الخيار forceIndex.
يمكنك استخدام الخيار forceIndex في أي مرحلة إدخال في
عمليات مسار البيانات لتجاوز خطة طلب البحث التلقائية في Cloud Firestore's وتحديد فهرس لاستخدامه، أو لفرض عملية فحص جدول.
فرض فهرس معيّن
لفرض استخدام طلب البحث لفهرس معيّن، قدِّم رقم تعريف الفهرس كسلسلة إلى الخيار forceIndex. يمكنك العثور على رقم تعريف الفهرس من وحدة التحكّم أو من رسائل الخطأ.
يفرض المثال التالي على أداة التخطيط استخدام الفهرس الذي يحمل رقم التعريف CICAgOi36pgK:
Node.js
// Force Planner to use Index ID CICAgOi36pgK await db.pipeline() .collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" }) .limit(100) .execute();
Java
// Force Planner to use Index ID CICAgOi36pgK Pipeline.Snapshot results1 = firestore.pipeline() .collectionGroup("customers", new CollectionGroupOptions() .withHints(new CollectionHints().withForceIndex("CICAgOi36pgK"))) .limit(100) .execute().get();
Go
// Force Planner to use Index ID CICAgOi36pgK snapshot1 := client.Pipeline(). CollectionGroup("customers", firestore.WithForceIndex("CICAgOi36pgK")). Limit(100). Execute(ctx)
في ما يلي بعض حالات استخدام فرض فهرس معيّن:
- اختبار أداء الفهارس المختلفة
- ضمان استخدام فهرس معيّن معروف بأنّه الأمثل لطلب البحث
- تجاوز أداة التحسين عندما يكون خيارها التلقائي غير مثالي لطلب بحث معيّن
إذا لم يتم العثور على الفهرس المحدّد، سيفشل طلب البحث.
فرض عملية فحص جدول
تقرأ عملية فحص الجدول المستندات في المجموعة أو مجموعة المجموعات بدون استخدام أي فهارس ثانوية. لفرض عملية فحص جدول، اضبط forceIndex على primary.
يفرض المثال التالي عملية فحص جدول:
// Force Planner to only do a Full-Table Scan
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "primary" })
.limit(100)
يمكنك استخدام عملية فحص جدول في الحالات التالية:
- للمجموعات الصغيرة جدًا التي لا يكون فيها عبء الفهرس مبرّرًا
- لطلبات البحث التي تصل إلى معظم المستندات في مجموعة
- لتحديد المشاكل وحلّها ومقارنات الأداء
استخدام forceIndex مع أداة "شرح طلب البحث"
يمكنك استخدام أداة "شرح طلب البحث" في وضعَي
explain أو analyze لمراقبة تأثيرات forceIndex:
- تأكَّد من أنّ Cloud Firestore استخدم الفهرس المحدّد في
forceIndexمن خلال التحقّق من العُقد الورقية لشجرة التنفيذ بحثًا عن رقم تعريف الفهرس. - تأكَّد من ظهور العقدة
TableScanفي الخطة عند استخدامforceIndex: "primary". - باستخدام وضع
analyze، قارِن مقاييس الأداء، مثل وقت الاستجابة والمستندات التي تم فحصها وإدخالات الفهرس التي تم فحصها، معforceIndexوبدونه لضبط أداء طلب البحث بدقة.
أفضل الممارسات لاستخدام forceIndex
على الرغم من أنّ forceIndex يوفّر مزيدًا من التحكّم في تنفيذ طلب البحث، فإنّ
Cloud Firestore's أداة تحسين طلبات البحث تكون فعّالة بشكلٍ عام لمعظم حالات الاستخدام.
ضَع في اعتبارك أفضل الممارسات التالية عند استخدام forceIndex:
- استخدِم
forceIndexبحذر. إذا لاحظت أداءً غير مثالي باستخدام خطة طلب البحث التلقائية، استخدِم أداة "شرح طلب البحث" لتشخيص المشكلة قبل فرض فهرس. - عند استخدام
forceIndex، احرص على اختبار طلبات البحث باستخدام أحجام بيانات واقعية لفهم خصائص أدائها وتكلفتها. - تجنَّب استخدام
forceIndex: "primary"في المجموعات الكبيرة في بيئات الإنتاج.
لمزيد من المعلومات عن ناتج طلب البحث الذي يتم تنفيذه باستخدام أداة "شرح طلب البحث"، اطّلِع على مرجع تنفيذ طلب البحث.