Query Explain की मदद से, क्वेरी के एक्ज़ीक्यूशन का विश्लेषण करना

इस पेज पर, क्वेरी लागू करने पर उसकी जानकारी पाने का तरीका बताया गया है.

क्वेरी की जानकारी पाने की सुविधा का इस्तेमाल करना

क्वेरी की जानकारी पाने की सुविधा का इस्तेमाल करके, यह जानें कि आपकी क्वेरी कैसे लागू की जा रही हैं. इससे आपको ऐसी जानकारी मिलती है जिसका इस्तेमाल करके, अपनी क्वेरी को ऑप्टिमाइज़ किया जा सकता है.

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

कंसोल
  1. Firebase कंसोल में, जाएं डेटाबेस और स्टोरेज > Firestore > डेटा > क्वेरी एडिटर.

  2. वह क्वेरी चलाएं जिसकी जानकारी आपको चाहिए.
  3. क्वेरी के विश्लेषण का आउटपुट देखने के लिए, क्वेरी की जानकारी टैब पर क्लिक करें.
Node.js (एडमिन)
import { field } from '@google-cloud/firestore/pipelines';

const q = db.pipeline()
        .collection('/users')
        .sort(field('status').ascending())
        .limit(100);
let results;
try {
    results = await q.execute({
        explainOptions: { mode: 'analyze', outputFormat: 'text' }
    });
} catch (error) {
    console.log(error);
}
const metrics = results?.explainStats?.text;

console.log(metrics);
Java (एडमिन)
Pipeline q = db.pipeline()
        .collection("/users")
        .sort(field("status").ascending())
        .limit(100);

PipelineExecuteOptions pipelineOpts = new PipelineExecuteOptions().withExplainOptions(
        new ExplainOptions().withExecutionMode(ExplainOptions.ExecutionMode.ANALYZE)
);
Pipeline.Snapshot result = q.execute(pipelineOpts).get();

String metrics = null;
if (result.getExplainStats() != null) {
    metrics = result.getExplainStats().getText();
    System.out.println(metrics);
}

क्वेरी की जानकारी पाने की सुविधा के मोड

आपको किस चीज़ को डिबग करना है, इसके आधार पर क्वेरी की जानकारी पाने की सुविधा का इस्तेमाल करके, क्वेरी को अलग-अलग मोड में लागू किया जा सकता है:

  • analyze: क्वेरी की योजना बनाता है और उसे लागू करता है. क्वेरी से मिलने वाले सामान्य नतीजों के साथ-साथ, प्लानर की जानकारी, रनटाइम के दौरान लागू होने के आंकड़े, और मेट्रिक दिखाता है.

  • explain: क्वेरी की योजना बनाता है, लेकिन उसे लागू नहीं करता. प्लानर की जानकारी दिखाता है, लेकिन रनटाइम के दौरान लागू होने के आंकड़े, मेट्रिक या नतीजे नहीं दिखाता. यह सुविधा, ज़्यादा खर्च वाली कार्रवाइयां किए बिना, क्वेरी के व्यवहार को डिबग करने में मददगार होती है.

विश्लेषण

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

db.pipeline().collection('/users').sort(field("status").ascending()).limit(100)

खास जानकारी वाले आंकड़े

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

Execution:
 results returned: 2
 request peak memory usage: 20.25 KiB (20,736 B)
 data bytes read: 148 B
 entity row scanned: 2

Billing:
 read units: 1

प्रोग्राम चलाने का ट्री

लागू करने का ट्री, क्वेरी के लागू होने की जानकारी को नोड की सीरीज़ के तौर पर दिखाता है. सबसे नीचे मौजूद नोड (लीफ़ नोड), स्टोरेज लेयर से डेटा लेते हैं. इसके बाद, क्वेरी का जवाब जनरेट करने के लिए, यह डेटा ट्री में ऊपर की ओर जाता है.

लागू करने के हर नोड के बारे में ज़्यादा जानकारी पाने के लिए, लागू करने का रेफ़रंस देखें.

क्वेरी को ऑप्टिमाइज़ करने के लिए, इस जानकारी का इस्तेमाल करने के तरीके के बारे में जानने के लिए, क्वेरी को लागू करने की प्रोसेस ऑप्टिमाइज़ करना लेख पढ़ें.

यहां लागू करने के ट्री का एक उदाहरण दिया गया है:

Tree:
• Compute
|  $out_1: map_set($record_1, "__name__", $__name___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 2
|   latency: 5.96 ms (local <1 ms)
|
└── • Compute
    |  $__name___1: map_get($record_1, "__key__")
    |
    |  Execution:
    |   records returned: 2
    |   latency: 5.88 ms (local <1 ms)
    |
    └── • MajorSort
        |  fields: [$v_1 ASC]
        |  output: [$record_1]
        |  limit: 100
        |
        |  Execution:
        |   records returned: 2
        |   latency: 5.86 ms (local <1 ms)
        |   peak memory usage: 20.25 KiB (20,736 B)
        |
        └── • Compute
            |  $v_1: map_get($record_1, "status")
            |
            |  Execution:
            |   records returned: 2
            |   latency: 5.23 ms (local <1 ms)
            |
            └── • TableScan
                   source: /users
                   order: UNDEFINED
                   properties: *
                   row range: (-∞..+∞)
                   output record: $record_1
                   variables: [$record_1]

                   Execution:
                    records returned: 2
                    latency: 4.68 ms
                    records scanned: 2
                    data bytes read: 148 B

आगे क्या करना है