क्वेरी की परफ़ॉर्मेंस ऑप्टिमाइज़ करना

क्वेरी की स्पीड कम होने की समस्या को ठीक करने के लिए, क्वेरी की पूरी जानकारी दिखाने वाले टूल का इस्तेमाल करें. इससे आपको क्वेरी के एक्ज़ीक्यूशन प्लान और रनटाइम एक्ज़ीक्यूशन प्रोफ़ाइल के बारे में जानकारी मिलेगी. इस सेक्शन में, एक्ज़ीक्यूशन प्रोफ़ाइल के आधार पर, क्वेरी की परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए किए जा सकने वाले चरणों के बारे में बताया गया है:

नतीजों की संख्या सीमित करना

यह पता करने के लिए कि क्वेरी से कई दस्तावेज़ मिल रहे हैं या नहीं, एक्ज़ीक्यूशन ट्री में, वापस लाए गए रिकॉर्ड वाला फ़ील्ड देखें. limit(...) स्टेज का इस्तेमाल करके, वापस लाए गए दस्तावेज़ों की संख्या सीमित करने पर विचार करें. ऐसा करने से, क्लाइंट को नेटवर्क पर वापस भेजे जाने वाले नतीजों के सीरियल में मौजूद बाइट का साइज़ कम हो जाता है. अगर Limit नोड से पहले MajorSort नोड आता है, तो क्वेरी इंजन, Limit और MajorSort नोड को एक साथ जोड़ सकता है. साथ ही, इन-मेमोरी मैटेरियलाइज़ेशन और सॉर्ट करने की पूरी प्रोसेस को TopN सॉर्ट से बदल सकता है. इससे क्वेरी के लिए मेमोरी की ज़रूरत कम हो जाती है.

नतीजे के तौर पर मिले दस्तावेज़ का साइज़ सीमित करना

सिर्फ़ ज़रूरी फ़ील्ड वापस लाने के लिए, select(...) का इस्तेमाल करके या बहुत बड़े फ़ील्ड को हटाने के लिए, remove_fields(...) का इस्तेमाल करके, वापस लाए गए दस्तावेज़ के साइज़ को सीमित करने पर विचार करें. इससे, इंटरमीडिएट नतीजों को प्रोसेस करने में लगने वाली कंप्यूटिंग और मेमोरी की लागत कम हो जाती है. साथ ही, क्लाइंट को नेटवर्क पर वापस भेजे जाने वाले नतीजों के सीरियल में मौजूद बाइट का साइज़ भी कम हो जाता है. अगर क्वेरी में रेफ़रंस दिए गए सभी फ़ील्ड, सामान्य इंडेक्स में शामिल हैं, तो क्वेरी को पूरी तरह से इंडेक्स स्कैन किया जा सकता है. इससे प्राइमरी स्टोरेज से दस्तावेज़ फ़ेच करने की ज़रूरत नहीं पड़ती.

इंडेक्स का इस्तेमाल करना

इंडेक्स सेट अप और ऑप्टिमाइज़ करने के लिए, यहां दिए गए निर्देशों का पालन करें.

यह पता करना कि क्वेरी किसी इंडेक्स का इस्तेमाल कर रही है या नहीं

यह पता करने के लिए कि क्वेरी किसी इंडेक्स का इस्तेमाल कर रही है या नहीं, एक्ज़ीक्यूशन ट्री में लीफ़ नोड देखें. अगर एक्ज़ीक्यूशन ट्री का लीफ़ नोड, एक TableScan नोड है, तो इसका मतलब है कि क्वेरी किसी इंडेक्स का इस्तेमाल नहीं कर रही है और प्राइमरी स्टोरेज से दस्तावेज़ स्कैन कर रही है. अगर किसी इंडेक्स का इस्तेमाल किया जा रहा है, तो एक्ज़ीक्यूशन ट्री का लीफ़ नोड, इंडेक्स का आईडी और इंडेक्स के फ़ील्ड दिखाएगा.

बेहतर इंडेक्स की पहचान करना

कोई इंडेक्स, क्वेरी के लिए तब काम का होता है, जब वह क्वेरी इंजन को प्राइमरी स्टोरेज से फ़ेच किए जाने वाले दस्तावेज़ों की संख्या कम कर सकता है. इसके अलावा, अगर उसके फ़ील्ड के क्रम से क्वेरी की सॉर्ट करने की ज़रूरत पूरी हो सकती है, तब भी वह इंडेक्स काम का होता है.

अगर किसी क्वेरी के लिए इंडेक्स का इस्तेमाल किया जाता है, लेकिन क्वेरी इंजन अब भी कई दस्तावेज़ फ़ेच और खारिज कर रहा है, तो यह इस बात का संकेत है कि इंडेक्स का इस्तेमाल करके क्वेरी प्रेडिकेट को पूरा नहीं किया जा सकता. ऐसा तब होता है, जब Scan नोड कई रिकॉर्ड दिखाता है और उसके बाद Filter नोड कुछ रिकॉर्ड दिखाता है. ज़्यादा काम का इंडेक्स बनाने के लिए, इंडेक्स बनाना लेख पढ़ें.

अगर किसी क्वेरी के लिए इंडेक्स का इस्तेमाल किया जाता है, लेकिन क्वेरी इंजन अब भी नतीजों के सेट को इन-मेमोरी में फिर से क्रम में लगा रहा है, तो यह इस बात का संकेत है कि इस्तेमाल किया गया इंडेक्स, क्वेरी की सॉर्ट करने की ज़रूरत को पूरा नहीं कर सकता. ऐसा तब होता है, जब क्वेरी के एक्ज़ीक्यूशन ट्री में MajorSort नोड दिखता है. ज़्यादा काम का इंडेक्स बनाने के लिए, अगला सेक्शन देखें.

इंडेक्स बनाना

इंडेक्स बनाने के लिए, इंडेक्स मैनेजमेंट से जुड़ा दस्तावेज़ पढ़ें . यह पक्का करने के लिए कि आपकी क्वेरी, इंडेक्स का इस्तेमाल कर सकती है, सामान्य (मल्टीकी नहीं) इंडेक्स बनाएं. इनमें फ़ील्ड इस क्रम में होने चाहिए:

  1. वे सभी फ़ील्ड जिनका इस्तेमाल, इक्वॉलिटी ऑपरेटर में किया जाएगा. क्वेरी में फिर से इस्तेमाल करने की संभावना को ज़्यादा से ज़्यादा करने के लिए, फ़ील्ड को इस क्रम में लगाएं कि इक्वॉलिटी ऑपरेटर में, क्वेरी के बीच फ़ील्ड की संख्या घटते क्रम में हो.
  2. वे सभी फ़ील्ड जिन्हें एक ही क्रम में सॉर्ट किया जाएगा.
  3. क्वेरी की कंस्ट्रेंट सेलेक्टिविटी के घटते क्रम में, रेंज या इनइक्वॉलिटी ऑपरेटर में इस्तेमाल किए जाने वाले फ़ील्ड.
  4. वे फ़ील्ड जिन्हें इंडेक्स में क्वेरी के हिस्से के तौर पर वापस लाया जाएगा. इंडेक्स में ऐसे फ़ील्ड शामिल करने से, इंडेक्स क्वेरी को कवर कर सकता है और प्राइमरी स्टोरेज से दस्तावेज़ फ़ेच करने की ज़रूरत नहीं पड़ती.

इंडेक्स या टेबल स्कैन को फ़ोर्स करना

Cloud Firestore के लिए क्वेरी करने पर, यह अपने-आप उन इंडेक्स का इस्तेमाल करता है जिनसे क्वेरी ज़्यादा असरदार बन सकती है. इसलिए, आपको अपनी क्वेरी के लिए कोई इंडेक्स तय करने की ज़रूरत नहीं होती. हालांकि, हम सुझाव देते हैं कि अपने वर्कलोड के लिए ज़रूरी क्वेरी के लिए, forceIndex विकल्प का इस्तेमाल करें. इससे आपको ज़्यादा बेहतर परफ़ॉर्मेंस मिलेगी.

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

Cloud Firestore के डिफ़ॉल्ट क्वेरी प्लान को बदलने और इस्तेमाल करने के लिए कोई इंडेक्स तय करने या टेबल स्कैन को फ़ोर्स करने के लिए, पाइपलाइन के ऑपरेशन में किसी भी इनपुट स्टेज पर forceIndex विकल्प का इस्तेमाल किया जा सकता है.Cloud Firestore

किसी खास इंडेक्स को फ़ोर्स करना

क्वेरी को किसी खास इंडेक्स का इस्तेमाल करने के लिए फ़ोर्स करने के लिए, 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 का क्वेरी ऑप्टिमाइज़र, ज़्यादातर मामलों में आम तौर पर असरदार होता है. forceIndex का इस्तेमाल करते समय, इन सबसे सही तरीकों को अपनाएं:

  • forceIndex का इस्तेमाल सोच-समझकर करें. अगर आपको डिफ़ॉल्ट क्वेरी प्लान के साथ बेहतर परफ़ॉर्मेंस नहीं मिलती है, तो क्वेरी की पूरी जानकारी दिखाने वाले टूल का इस्तेमाल करके समस्या का पता लगाएं इंडेक्स को फ़ोर्स करने से पहले.
  • forceIndex का इस्तेमाल करते समय, पक्का करें कि आपने अपनी क्वेरी की जांच, असली डेटा वॉल्यूम के साथ की हो. इससे आपको उनकी परफ़ॉर्मेंस और लागत की विशेषताओं के बारे में पता चलेगा.
  • प्रोडक्शन एनवायरमेंट में, बड़े कलेक्शन पर forceIndex: "primary" का इस्तेमाल न करें.

क्वेरी की पूरी जानकारी दिखाने वाले टूल की मदद से एक्ज़ीक्यूट की गई क्वेरी के आउटपुट के बारे में ज़्यादा जानने के लिए, क्वेरी के एक्ज़ीक्यूशन का रेफ़रंस देखें.