الحقول المجزّأة

توضّح هذه الصفحة كيفية عرض استخدام الحقول المجزّأة والتحكّم فيه في Cloud Firestore. تتوفّر هذه الميزة في إصدار Firestore Enterprise.

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

طلبات البحث التي تستفيد من الحقول المجزّأة

يتم تطبيق عمليات القراءة على الحقول المجزّأة على أشكال طلبات البحث التالية حيثما ينطبق ذلك:

  • طلبات البحث التجميعية: طلبات البحث التي تحتاج فقط إلى الوصول إلى مجموعة فرعية من الحقول لإجراء عمليات التجميع على سبيل المثال:

    db.pipeline()
      .collection("/customers")
      .where(lessThan("account_balance", 0))
      .aggregate(
        countAll().as("total"),
      )
    

    أو باستخدام group-by:

    db.pipeline()
      .collection("/customers")
      .where(lessThan("account_balance", 0))
      .aggregate({
        accumulators: [
          field('account_balance').average().as('avg_account_balance')
        ],
        groups: [field('market_segment')]
      })
    
  • طلبات البحث الخاصة بالعرض: هي طلبات بحث تعرض مجموعة فرعية محدّدة فقط من الحقول. على سبيل المثال:

    db.pipeline()
      .collection("/customers")
      .select("family_name", "given_name")
      .limit(10)
    
  • طلبات البحث التي تتضمّن فلاتر: طلبات البحث التي يحدّد فيها Cloud Firestore محرك البحث أنّ استخدام الحقول المجزّأة لفلترة المستندات مفيد. على سبيل المثال:

    db.pipeline()
      .collection("/customers")
      .where(equal("given_name", "alice"))
    

عرض استخدام الحقول المجزّأة

يمكنك استخدام "شرح الاستعلام" للتحقّق مما إذا كان الاستعلام يستخدم حقولاً مجزّأة. تتضمّن العقدة TableScan في خطة طلب البحث قسم Storage يتضمّن المقاييس التالية:

  • شكل الفحص:
    • shredded_fields_only: لا يقرأ طلب البحث إلا من الحقول المجزّأة.
    • shredded_fields_backjoin: يتم تنفيذ طلب البحث من الحقول المجزّأة، ويتم الربط بالمستند الأصلي للحصول على الحقول الأخرى.
  • الحقول المجزّأة المستخدَمة: قائمة بأسماء الحقول التي تمّت قراءتها كحقول مجزّأة.
  • عدد عمليات إعادة الفحص: خريطة لعدادات عمليات إعادة الفحص تعني إعادة الفحص الرجوع إلى قراءة المستند الكامل الأصلي عند فحص الحقول المجزأة. قد يحدث ذلك إذا تجاوزت قيمة الحقل في المستند 8 كيلوبايت، وهو حجم كبير جدًا بالنسبة إلى مساحة تخزين الحقول المجزّأة.

مثال على الناتج

...
└── • TableScan
        source: /customers
        order: UNDEFINED
        row range: (-∞..+∞)
        filter: ($account_balance_1 < 0L)
        output bindings: {$account_balance_1=account_balance, $market_segment_1=market_segment}
        variables: [$account_balance_1, $market_segment_1]

        Execution:
         records returned: 1,374
         latency: 26.58 ms
         post-filtered rows: 13,626
         records scanned: 15,000
         data bytes read: 23.73 MiB (24,887,141 B)

        Storage:
         scan shape: shredded_fields_only
         shredded fields used: [account_balance, market_segment]

التحكّم في استخدام الحقول المجزّأة

تستخدم Cloud Firestore تلقائيًا الحقول المجزّأة عند توفّرها. يمكنك التحكّم في هذا السلوك باستخدام خيار طلب البحث table_scan_method.

القيم المسموح بها للخيار table_scan_method:

  • shredded_fields_enabled (الإعداد التلقائي): استخدام الحقول المجزّأة عند توفّرها
  • shredded_fields_disabled: لا تستخدِم الحقول المجزّأة.
  • force_shredded_fields: تعذُّر تنفيذ طلب البحث إذا تعذّر إجراء فحص الجدول من خلال فحص الحقول المجزّأة.

مثال

var opts = new PipelineExecuteOptions()
    .with("table_scan_method", "shredded_fields_disabled");

var snapshot = db.pipeline()
    .collection("/customers")
    .where(equal("given_name", "alice"))
    .execute(opts)
    .get();

تحذيرات بشأن أداء طلبات البحث

قد تصدر Cloud Firestore تحذيرات بشأن الأداء في نتيجة شرح طلب البحث عند رصد استخدام غير فعّال للحقل المجزّأ. على سبيل المثال:

  • طلبات البحث ذات الانتقائية المنخفضة: تحدث عندما يبحث طلب البحث في الحقول المجزّأة لتطبيق الفلترة، ولكنّه يستبعد عددًا قليلاً جدًا من المستندات، ما يجعل البحث غير فعّال.

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

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

القيود

لا يجزّئ Cloud Firestore سوى الحقول ذات المستوى الأعلى. ويفرض أيضًا قيودًا على عدد الحقول التي يمكن تقسيمها لكل حزمة مجموعات.