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

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

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

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

क्वेरी के बारे में जानकारी:

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

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

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

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

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

क्वेरी एक्सप्लेन की सुविधा का इस्तेमाल करने के लिए क्या शुल्क देना होगा?

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

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

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

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

ध्यान दें कि अनुरोधों की पुष्टि, 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();

    
नोड (एडमिन)

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();

    
नोड (एडमिन)

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