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

यह सिर्फ़ Cloud Firestore Enterprise Edition के लिए काम का है.

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

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

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

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

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

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

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

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

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

यह पता लगाना कि इस्तेमाल किए गए इंडेक्स को ऑप्टिमाइज़ किया जा सकता है या नहीं

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

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

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

$lookup के लिए इंडेक्स

$lookup स्टेज की परफ़ॉर्मेंस को बेहतर बनाने के लिए, from कलेक्शन में मौजूद foreignField पर इंडेक्स बनाएं. इससे जॉइन ऑपरेशन को, पूरे कलेक्शन को स्कैन किए बिना from कलेक्शन में मिलते-जुलते दस्तावेज़ आसानी से ढूंढने में मदद मिलती है.

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

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

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

ऐसी क्वेरी के लिए मल्टीकी इंडेक्स बनाएं जिनमें ऐरे फ़ील्ड को फ़िल्टर और क्रम से लगाना शामिल हो.

क्वेरी के सुझाव का इस्तेमाल करना

अगर आपने क्वेरी के लिए ज़्यादा सही इंडेक्स बनाया है, लेकिन क्वेरी इंजन उस इंडेक्स का इस्तेमाल नहीं कर रहा है, तो क्वेरी हिंट का इस्तेमाल करके क्वेरी इंजन की इंडेक्स प्राथमिकता को बदला जा सकता है.

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