क्वेरी की जानकारी देने वाली सुविधा की मदद से, Cloud Firestore क्वेरी को
बैकएंड पर सबमिट किया जा सकता है. इसके बदले में, बैकएंड पर क्वेरी के एक्ज़ीक्यूशन के बारे में परफ़ॉर्मेंस के आंकड़े पाए जा सकते हैं
. यह कई रिलेशनल डेटाबेस सिस्टम में, EXPLAIN [ANALYZE] कार्रवाई की तरह काम करती है.
क्वेरी की जानकारी देने वाली सुविधा के नतीजों से, यह समझने में मदद मिलती है कि आपकी क्वेरी कैसे एक्ज़ीक्यूट की जाती हैं. इससे आपको इनएफ़िशिएंसी और सर्वर-साइड बॉटलनेक की जगह के बारे में पता चलता है.
क्वेरी की जानकारी देने वाली सुविधा के बारे में जानकारी:
- क्वेरी की प्लानिंग के फ़ेज़ के बारे में अहम जानकारी देती है, ताकि क्वेरी के इंडेक्स को अडजस्ट किया जा सके और उसकी परफ़ॉर्मेंस को बेहतर बनाया जा सके.
- विश्लेषण के विकल्प का इस्तेमाल करके, हर क्वेरी के हिसाब से लागत और परफ़ॉर्मेंस को समझने में मदद मिलती है. साथ ही, क्वेरी के पैटर्न को ऑप्टिमाइज़ करने के लिए, अलग-अलग पैटर्न को तेज़ी से आज़माया जा सकता है.
क्वेरी की जानकारी देने वाली सुविधा के विकल्पों के बारे में जानकारी: डिफ़ॉल्ट और विश्लेषण
क्वेरी की जानकारी देने वाली सुविधा की कार्रवाइयां, डिफ़ॉल्ट विकल्प या विश्लेषण विकल्प का इस्तेमाल करके की जा सकती हैं.
डिफ़ॉल्ट विकल्प के साथ, क्वेरी की जानकारी देने वाली सुविधा क्वेरी की प्लानिंग करती है, लेकिन एक्ज़ीक्यूशन के स्टेज को छोड़ देती है. इससे प्लानर स्टेज की जानकारी मिलती है. इसका इस्तेमाल करके, यह देखा जा सकता है कि किसी क्वेरी में ज़रूरी इंडेक्स हैं या नहीं. साथ ही, यह भी समझा जा सकता है कि किन इंडेक्स का इस्तेमाल किया गया है. इससे यह पुष्टि करने में मदद मिलेगी कि कोई खास क्वेरी, कई अलग-अलग इंडेक्स को इंटरसेक्ट करने के बजाय, कंपोज़िट इंडेक्स का इस्तेमाल कर रही है.
विश्लेषण के विकल्प के साथ, क्वेरी की जानकारी देने वाली सुविधा क्वेरी की प्लानिंग और उसे एक्ज़ीक्यूट, दोनों करती है. इससे, पहले बताई गई प्लानर की सभी जानकारी के साथ-साथ, क्वेरी के एक्ज़ीक्यूशन के रनटाइम के आंकड़े भी मिलते हैं. इसमें, क्वेरी की बिलिंग की जानकारी के साथ-साथ, क्वेरी के एक्ज़ीक्यूशन के बारे में सिस्टम-लेवल की अहम जानकारी भी शामिल होती है. इस टूल का इस्तेमाल करके, क्वेरी और इंडेक्स के अलग-अलग कॉन्फ़िगरेशन की जांच की जा सकती है, ताकि उनकी लागत और इंतज़ार के समय को ऑप्टिमाइज़ किया जा सके.
क्वेरी की जानकारी देने वाली सुविधा की लागत कितनी होती है?
डिफ़ॉल्ट विकल्प के साथ क्वेरी की जानकारी देने वाली सुविधा का इस्तेमाल करने पर, इंडेक्स या रीड की कार्रवाइयां नहीं की जाती हैं. क्वेरी कितनी भी जटिल हो, रीड की एक कार्रवाई के लिए शुल्क लिया जाता है.
विश्लेषण के विकल्प के साथ क्वेरी की जानकारी देने वाली सुविधा का इस्तेमाल करने पर, इंडेक्स और रीड की कार्रवाइयां की जाती हैं. इसलिए, क्वेरी के लिए सामान्य शुल्क लिया जाता है. विश्लेषण की गतिविधि के लिए कोई अतिरिक्त शुल्क नहीं लिया जाता. सिर्फ़ एक्ज़ीक्यूट की जा रही क्वेरी के लिए सामान्य शुल्क लिया जाता है.
डिफ़ॉल्ट विकल्प के साथ क्वेरी की जानकारी देने वाली सुविधा का इस्तेमाल करना
डिफ़ॉल्ट विकल्प के लिए अनुरोध सबमिट करने के लिए, क्लाइंट लाइब्रेरी का इस्तेमाल किया जा सकता है.
ध्यान दें कि अनुरोधों की पुष्टि, IAM की मदद से की जाती है. इसके लिए, सामान्य क्वेरी की कार्रवाइयों के लिए इस्तेमाल की जाने वाली अनुमतियों का ही इस्तेमाल किया जाता है. पुष्टि करने के अन्य तरीकों, जैसे कि Firebase Authentication, को अनदेखा किया जाता है. ज़्यादा जानकारी के लिए, सर्वर क्लाइंट लाइब्रेरी के लिए IAM के बारे में गाइड देखें.
Java (एडमिन)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
Node (एडमिन)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
रिस्पॉन्स का फ़ॉर्मैट, एक्ज़ीक्यूशन एनवायरमेंट पर निर्भर करता है. मिले नतीजों को JSON में बदला जा सकता है. उदाहरण के लिए:
{
"indexes_used": [
{"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
{"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
]
}ज़्यादा जानकारी के लिए, क्वेरी की जानकारी देने वाली सुविधा की रिपोर्ट का रेफ़रंस देखें.
विश्लेषण के विकल्प के साथ क्वेरी की जानकारी देने वाली सुविधा का इस्तेमाल करना
विश्लेषण के विकल्प के लिए अनुरोध सबमिट करने के लिए, क्लाइंट लाइब्रेरी का इस्तेमाल किया जा सकता है.
ध्यान दें कि अनुरोधों की पुष्टि, IAM की मदद से की जाती है. इसके लिए, सामान्य क्वेरी की कार्रवाइयों के लिए इस्तेमाल की जाने वाली अनुमतियों का ही इस्तेमाल किया जाता है. पुष्टि करने के अन्य तरीकों, जैसे कि Firebase Authentication, को अनदेखा किया जाता है. ज़्यादा जानकारी के लिए, सर्वर क्लाइंट लाइब्रेरी के लिए IAM के बारे में गाइड देखें.
Java (एडमिन)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();
Node (एडमिन)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'true' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;
यहां दिए गए उदाहरण में, planInfo के अलावा, stats ऑब्जेक्ट भी दिखाया गया है.
रिस्पॉन्स का फ़ॉर्मैट, एक्ज़ीक्यूशन एनवायरमेंट पर निर्भर करता है. रिस्पॉन्स का उदाहरण, JSON फ़ॉर्मैट में है.
{
"resultsReturned": "5",
"executionDuration": "0.100718s",
"readOperations": "5",
"debugStats": {
"index_entries_scanned": "95000",
"documents_scanned": "5"
"billing_details": {
"documents_billable": "5",
"index_entries_billable": "0",
"small_ops": "0",
"min_query_cost": "0",
}
}
}ज़्यादा जानकारी के लिए, क्वेरी की जानकारी देने वाली सुविधा की रिपोर्ट का रेफ़रंस देखें.
नतीजों को समझना और उनमें बदलाव करना
आइए, एक उदाहरण देखते हैं. इसमें हम, फ़िल्मों की शैली और प्रोडक्शन के देश के हिसाब से क्वेरी करते हैं.
उदाहरण के लिए, इस एसक्यूएल क्वेरी को देखें.
SELECT * FROM /movies WHERE category = 'Romantic' AND country = 'USA';
अगर हम विश्लेषण के विकल्प का इस्तेमाल करते हैं, तो मिले मेट्रिक से पता चलता है कि क्वेरी, सिंगल-फ़ीड इंडेक्स (category ASC, __name__ ASC) और (country ASC, __name__ ASC) पर चलती है. यह 16,500 इंडेक्स एंट्री स्कैन करती है, लेकिन सिर्फ़ 1,200 दस्तावेज़ दिखाती है.
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"}, ] } // Output query status { "resultsReturned": "1200", "executionDuration": "0.118882s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "16500", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
क्वेरी को एक्ज़ीक्यूट करने की परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, पूरी तरह से कवर किया गया कंपोज़िट इंडेक्स (category ASC, country ASC, __name__ ASC) बनाया जा सकता है.
विश्लेषण के विकल्प के साथ क्वेरी को फिर से चलाने पर, हम देख सकते हैं कि इस क्वेरी के लिए, नया बनाया गया इंडेक्स चुना गया है. साथ ही, क्वेरी पहले से ज़्यादा तेज़ी से और बेहतर तरीके से चलती है.
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, country ASC, __name__ ASC)"} ] } // Output query stats { "resultsReturned": "1200", "executionDuration": "0.026139s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "1200", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }