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

এই পৃষ্ঠায় বর্ণনা করা হয়েছে, কীভাবে একটি কোয়েরি চালানোর সময় তার সম্পাদন সংক্রান্ত তথ্য পুনরুদ্ধার করতে হয়।

কোয়েরি এক্সপ্লেইন ব্যবহার করুন

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

আপনি গুগল ক্লাউড কনসোল অথবা explain কমান্ডের মাধ্যমে কোয়েরি এক্সপ্লেইন ব্যবহার করতে পারেন।

কনসোল

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

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

    ডাটাবেসে যান

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

    কনসোলের এক্সপ্লেইন ট্যাবে কোয়েরি করুন।
MongoDB API

MongoDB API-তে কোয়েরি এক্সপ্লেইন (Query Explain) ' explain কমান্ডের মাধ্যমে সমর্থিত, যা আপনি Mongo Shell এবং Compass-এর মতো টুলগুলিতে ব্যবহার করতে পারেন।

explain কমান্ডটি aggregate , find , distinct , এবং count কমান্ডের সাথে সমর্থিত, উদাহরণস্বরূপ:

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

আপনি explain() মেথডটিও ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

db.collection.find({QUERY}).explain('executionStats')
সীমাবদ্ধতা
নিম্নলিখিত সীমাবদ্ধতা ও পার্থক্যগুলো লক্ষ্য করুন:
  • কোয়েরি এক্সপ্লেইন এমন কমান্ড সমর্থন করে না যা কার্সর রিটার্ন করে। উদাহরণস্বরূপ, সরাসরি নিম্নলিখিত কমান্ডটি কল করে এক্সপ্লেইন চালু করা সমর্থিত নয়:

    db.collection.aggregate(..., explain: true)
  • কোয়েরি এক্সপ্লেইন শুধুমাত্র find , aggregate , count , distinct , update , delete এবং findAndModify কমান্ডগুলোতে সমর্থিত।

  • Query Explain, executionStats , allPlansExecution এবং queryPlanner ভার্বোসিটি মোডগুলোকে সমর্থন করে।

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

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

বিশ্লেষণ

কোয়েরি এক্সপ্লেইন-এর আউটপুটে দুটি প্রধান উপাদান থাকে—সামারি স্ট্যাটিস্টিকস এবং এক্সিকিউশন ট্রি। উদাহরণ হিসেবে এই কোয়েরিটি বিবেচনা করুন:

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)

এরপর কী?