क्वेरी की जानकारी का इस्तेमाल करके, क्वेरी की परफ़ॉर्मेंस को समझना

क्वेरी की जानकारी की मदद से, बैकएंड में Cloud Firestore क्वेरी सबमिट की जा सकती हैं. साथ ही, आपको बैकएंड क्वेरी लागू करने के बाद, परफ़ॉर्मेंस के पूरे आंकड़े मिल जाते हैं. यह कई रिलेशनल डेटाबेस सिस्टम में EXPLAIN [ANALYZE] ऑपरेशन की तरह काम करता है.

क्वेरी की जानकारी के अनुरोध Firestore सर्वर क्लाइंट लाइब्रेरी का इस्तेमाल करके भेजे जा सकते हैं.

क्वेरी की पूरी जानकारी देने वाले नतीजों से यह समझने में मदद मिलती है कि आपकी क्वेरी को कैसे पूरा किया जा रहा है. इससे आपको कमियों और सर्वर साइड से जुड़ी संभावित समस्याओं की जगह के बारे में जानकारी मिलती है.

क्वेरी की जानकारी:

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

क्वेरी की पूरी जानकारी देने वाले विकल्पों को समझना: डिफ़ॉल्ट तरीका और विश्लेषण करें

क्वेरी की पूरी जानकारी वाली कार्रवाइयां, डिफ़ॉल्ट विकल्प या विश्लेषण विकल्प का इस्तेमाल करके की जा सकती हैं.

डिफ़ॉल्ट विकल्प में, 'क्वेरी की जानकारी' सुविधा क्वेरी को प्लान करती है, लेकिन क्वेरी को एक्ज़ीक्यूशन के चरण से आगे बढ़ा देती है. इससे प्लानर स्टेज की जानकारी मिलेगी. इसका इस्तेमाल यह देखने के लिए किया जा सकता है कि क्वेरी में ज़रूरी इंडेक्स हैं या नहीं. साथ ही, यह भी समझा जा सकता है कि किन इंडेक्स का इस्तेमाल किया जाता है. उदाहरण के लिए, इससे आपको यह पुष्टि करने में मदद मिलेगी कि कोई खास क्वेरी, कई अलग-अलग इंडेक्स के बजाय कंपोज़िट इंडेक्स का इस्तेमाल कर रही है.

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

क्वेरी की पूरी जानकारी देने वाली सुविधा की कीमत क्या है?

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

विश्लेषण करने के विकल्प के साथ क्वेरी की जानकारी का इस्तेमाल करने पर, इंडेक्स करने और पढ़ने से जुड़ी कार्रवाइयां की जाती हैं. इसलिए, क्वेरी के लिए आपसे हमेशा की तरह शुल्क लिया जाता है. विश्लेषण गतिविधि के लिए कोई अतिरिक्त शुल्क नहीं लिया जाता, सिर्फ़ क्वेरी के लिए सामान्य शुल्क लिया जाता है.

डिफ़ॉल्ट विकल्प के साथ क्वेरी की जानकारी का इस्तेमाल करें

डिफ़ॉल्ट विकल्प का अनुरोध सबमिट करने के लिए, क्लाइंट लाइब्रेरी का इस्तेमाल किया जा सकता है.

ध्यान दें कि अनुरोधों की पुष्टि IAM की मदद से की जाती है. इसके लिए, सामान्य क्वेरी ऑपरेशन के लिए एक जैसी अनुमतियां ली जाती हैं. पुष्टि करने की अन्य तकनीकों को अनदेखा किया जाता है, जैसे कि Firebase से पुष्टि करना. ज़्यादा जानकारी के लिए, सर्वर क्लाइंट लाइब्रेरी के लिए 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();

    
नोड (एडमिन)

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 से पुष्टि करना. ज़्यादा जानकारी के लिए, सर्वर क्लाइंट लाइब्रेरी के लिए 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();

    
नोड (एडमिन)

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 इंडेक्स एंट्री को स्कैन करता है, लेकिन सिर्फ़ 1200 दस्तावेज़ दिखाता है.

// 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",
               }
    }
}