কোয়েরি এক্সপ্লেন ব্যবহার করে কোয়েরি এক্সিকিউশন বিশ্লেষণ করুন

আপনি কোনও কোয়েরি এক্সিকিউট করলে, কোয়েরি এক্সিকিউশন সংক্রান্ত তথ্য কীভাবে ফিরিয়ে আনবেন তা এই পৃষ্ঠায় বর্ণনা করা হয়েছে।

কোয়েরি ব্যাখ্যা ব্যবহার করুন

আপনার কোয়েরি কীভাবে এক্সিকিউট করা হচ্ছে তা বুঝতে 'কোয়েরি ব্যাখ্যা' ব্যবহার করুন। এটি এমন বিবরণ প্রদান করে যা আপনি আপনার কোয়েরি অপ্টিমাইজ করতে ব্যবহার করতে পারেন।

আপনি 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);
}

মোড ব্যাখ্যা করুন

আপনি কী ডিবাগ করতে চান তার উপর নির্ভর করে, আপনি বিভিন্ন মোডে Query Explain-এর মাধ্যমে একটি কোয়েরি এক্সিকিউট করতে পারেন:

  • analyze: কোয়েরি প্ল্যান ও এক্সিকিউট করে। কোয়েরি থেকে পাওয়া সাধারণ ফলাফলের পাশাপাশি প্ল্যানার সংক্রান্ত তথ্য, রানটাইম এক্সিকিউশন পরিসংখ্যান ও মেট্রিক দেখায়।

  • explain: কোয়েরি প্ল্যান করে, কিন্তু এটি এক্সিকিউট করে না। প্ল্যানার তথ্য দেখায় কিন্তু কোনও রানটাইম পরিসংখ্যান, মেট্রিক বা ফলাফল দেখায় না। এটি খরচসাপেক্ষ অপারেশন না চালিয়েই কোয়েরির আচরণ ডিবাগ করার জন্য উপযোগী।

  • stats: কোয়েরি প্ল্যান ও এক্সিকিউট করে, কিন্তু ফলাফল দেখায় না। প্ল্যানার সংক্রান্ত তথ্য, রানটাইম এক্সিকিউশন পরিসংখ্যান এবং মেট্রিক দেখায়।

বিশ্লেষণ

Query Explain-এর আউটপুটে দুটি প্রধান কম্পোনেন্ট থাকে - Summary Statistics এবং Execution Tree। উদাহরণ হিসেবে এই কোয়েরিটি বিবেচনা করুন:

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

এর পরে কী করতে হবে