श्रेड किए गए फ़ील्ड

इस पेज पर, Cloud Firestore में श्रेडेड फ़ील्ड के इस्तेमाल को देखने और कंट्रोल करने का तरीका बताया गया है. यह सुविधा, Firestore Enterprise वर्शन में उपलब्ध है.

दस्तावेज़ लिखे जाने पर, Cloud Firestore यह तय कर सकता है कि कुछ फ़ील्ड को श्रेडेड फ़ॉर्मैट में सेव किया जाना चाहिए. श्रेड किए गए फ़ील्ड, क्वेरी की परफ़ॉर्मेंस को ऑप्टिमाइज़ करते हैं. ऐसा इसलिए, क्योंकि वे पूरे दस्तावेज़ के बजाय सिर्फ़ ज़रूरी फ़ील्ड पढ़ते हैं.

श्रेड किए गए फ़ील्ड से फ़ायदा पाने वाली क्वेरी

श्रेड किए गए फ़ील्ड को पढ़ने की सुविधा, क्वेरी के इन फ़ॉर्मैट पर लागू होती है. हालांकि, यह सुविधा सिर्फ़ उन फ़ॉर्मैट पर लागू होती है जहां यह काम करती है:

  • एग्रीगेशन क्वेरी: ऐसी क्वेरी जिनके लिए, एग्रीगेशन ऑपरेशन के लिए फ़ील्ड के सिर्फ़ एक सबसेट को ऐक्सेस करने की ज़रूरत होती है. उदाहरण के लिए:

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

    या ग्रुप-बाय के साथ:

    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 सिर्फ़ टॉप-लेवल फ़ील्ड को मिटाता है. इससे, हर कलेक्शन ग्रुप के हिसाब से श्रेड किए जा सकने वाले फ़ील्ड की संख्या भी सीमित हो जाती है.