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

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

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

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

আপনি গুগল ক্লাউড কনসোল অথবা 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 কমান্ডগুলোতে সমর্থিত।

  • MongoDB API-এর মাধ্যমে Query Explain-এর Verbosity এবং Comment অপশনগুলো সমর্থিত নয়। এর আচরণ executionStats অপশনের অনুরূপ। allPlansExecution এবং queryPlanner অপশনগুলো প্রদান করা হলে তা উপেক্ষা করা হয়।

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

বিশ্লেষণ

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

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

সারসংক্ষেপ পরিসংখ্যান

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

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

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

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

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

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

নিম্নে একটি এক্সিকিউশন ট্রি-এর উদাহরণ দেওয়া হলো:

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

এরপর কী?