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

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

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

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

আপনি Google Cloud কনসোল বা explain কমান্ডের মাধ্যমে Query Explain ব্যবহার করতে পারবেন।

কনসোল

কোয়েরি এডিটরে কোয়েরি এক্সিকিউট করুন এবং ব্যাখ্যা ট্যাব খুলুন:

  1. Google Cloud কনসোলে, ডেটাবেস পৃষ্ঠায় যান।

    ডেটাবেসে যান

  2. ডেটাবেসের তালিকা থেকে, একটি Cloud Firestore ডেটাবেস বেছে নিন। Google Cloud কনসোল সেই ডেটাবেসের জন্য Firestore Explorer খোলে।
  3. কোয়েরি এডিটরে কোয়েরি লিখে রান করুন বিকল্পে ক্লিক করুন।
  4. কোয়েরি বিশ্লেষণ আউটপুট দেখতে ব্যাখ্যা ট্যাবে ক্লিক করুন।

    কনসোলে কোয়েরি ব্যাখ্যা করার ট্যাব
MongoDB API

MongoDB API-তে কোয়েরি এক্সপ্লেন explain কমান্ডের মাধ্যমে কাজ করে, যা আপনি Mongo Shell এবং Compass-এর মতো টুলে ব্যবহার করতে পারবেন।

explain কমান্ডটি aggregate, find, distinct এবং count কমান্ডের সাথে কাজ করে, যেমন:

db.collection.explain('executionStats').find(...)

এছাড়াও, আপনি explain() পদ্ধতি ব্যবহার করতে পারেন, যেমন:

db.collection.find({QUERY}).explain('executionStats')
সীমাবদ্ধতা
নিম্নলিখিত সীমাবদ্ধতা ও পার্থক্যগুলি লক্ষ্য করুন:
  • Query Explain এমন কমান্ড সমর্থন করে না যা কার্সার রিটার্ন করে। যেমন, সরাসরি নিম্নলিখিত কমান্ড কল করে ব্যাখ্যা করার জন্য অনুরোধ করা যাবে না:

    db.collection.aggregate(..., explain: true)
  • Query Explain শুধুমাত্র find, aggregate, count, distinct, update, delete এবং findAndModify কমান্ডে কাজ করে।

  • কোয়েরি এক্সপ্লেন executionStats, allPlansExecution এবং queryPlanner ভার্বোসিটি মোড সাপোর্ট করে।

    • queryPlanner: কোয়েরি এক্সিকিউট না করে, শুধুমাত্র এক্সিকিউশন প্ল্যান ফিরিয়ে আনে,
    • executionStats এবং allPlansExecution: বিলিং, মেমরি এবং এক্সিকিউশন পরিসংখ্যান সহ এক্সিকিউশন প্ল্যান রিটার্ন করে।

    কোনও ভার্বোসিটি মোড নির্দিষ্ট করা না থাকলে, শেল ডিফল্ট হিসেবে queryPlanner-এ সেট হয়ে যায়। সম্পূর্ণ এক্সিকিউশন পরিসংখ্যান দেখতে, আপনাকে অবশ্যই executionStats বা allPlansExecution ভার্বোসিটি মোড নির্দিষ্ট করতে হবে।

বিশ্লেষণ

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

db.orders.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

পরিসংখ্যানের সারাংশ

ব্যাখ্যা করা আউটপুটের উপরে এক্সিকিউশন পরিসংখ্যানের সারসংক্ষেপ থাকে। কোনও কোয়েরির লেটেন্সি বা খরচ বেশি কিনা তা নির্ধারণ করতে এই পরিসংখ্যান ব্যবহার করুন। এছাড়াও, এতে মেমরি সংক্রান্ত পরিসংখ্যান থাকে যা আপনাকে জানায় যে আপনার কোয়েরি মেমরির সীমার কতটা কাছাকাছি।

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

এক্সিকিউশন ট্রি

এক্সিকিউশন ট্রি, কোয়েরি এক্সিকিউশনকে নোডের সিরিজ হিসেবে বর্ণনা করে। নিচের নোডগুলি (লিফ নোড) স্টোরেজ লেয়ার থেকে ডেটা রিট্রিভ করে যা কোয়েরির উত্তর তৈরি করতে ট্রি-র উপরের দিকে যায়।

প্রতিটি এক্সিকিউশন নোড সম্পর্কে বিস্তারিত জানতে, এক্সিকিউশন রেফারেন্স দেখুন।

আপনার কোয়েরি অপ্টিমাইজ করার জন্য এই তথ্য কীভাবে ব্যবহার করবেন সেই সম্পর্কে বিস্তারিত জানতে, কোয়েরি এক্সিকিউশন অপ্টিমাইজ করুন দেখুন।

নিম্নলিখিতটি হল এক্সিকিউশন ট্রির একটি উদাহরণ:

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

Tree:
• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 35
|   latency: 204.87 ms (local 7.64 ms)
|
└── • Compute
    |  $__id___1: _id($__key___2)
    |
    |  Execution:
    |   records returned: 35
    |   latency: 197.23 ms (local 2.04 ms)
    |
    └── • MajorSort
        |  fields: [$v_5 ASC]
        |  output: [$__key___2, $record_1]
        |
        |  Execution:
        |   records returned: 35
        |   latency: 195.20 ms (local 28.42 ms)
        |   peak memory usage: 45.56 KiB (46,656 B)
        |
        └── • Compute
            |  $v_5: offset($v_4, 0L)
            |
            |  Execution:
            |   records returned: 35
            |   latency: 166.78 ms (local 14.84 ms)
            |
            └── • Compute
                |  $v_4: sortPaths(array($date_placed_1), [date_placed ASC])
                |
                |  Execution:
                |   records returned: 35
                |   latency: 151.94 ms (local 5.43 ms)
                |
                └── • TableScan
                       source: **/orders
                       order: STABLE
                       filter: $eq($user_id_1, 1,234)
                       output bindings: {$__key___2=row().__key__, $date_placed_1=row().date_placed, $record_1=row[* - { __create_time__, __update_time__ }](), $user_id_1=row().user_id}
                       output: [$__key___2, $date_placed_1, $record_1]

                       Execution:
                        records returned: 35
                        latency: 146.50 ms
                        data bytes returned: 3.25 KiB (3,325 B)
                        post-filtered rows: 230
                        records scanned: 265
                        data bytes read: 24.58 KiB (25,175 B)

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