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

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

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

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

क्वेरी की व्याख्या:

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

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

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

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

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

'क्वेरी के बारे में जानकारी दें' सुविधा का इस्तेमाल करने के लिए कितना शुल्क देना पड़ता है?

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

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

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

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

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

ज़्यादा जानकारी के लिए, क्वेरी की व्याख्या करने वाली रिपोर्ट का रेफ़रंस देखें.

'विश्लेषण करें' विकल्प के साथ Query Explain का इस्तेमाल करना

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

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