কোয়েরি এক্সিকিউশন রেফারেন্স

এই পৃষ্ঠায় কোয়েরি এক্সপ্লেন ব্যবহার করে এক্সিকিউট করা কোয়েরির আউটপুট ব্যাখ্যা করা হয়েছে। Query Explain-এর মাধ্যমে কীভাবে কোয়েরি এক্সিকিউট করতে হয় তা জানতে, Query Explain-এর মাধ্যমে কোয়েরি এক্সিকিউশন বিশ্লেষণ করুন দেখুন।

সাধারণ ধারণা

এক্সিকিউশন ট্রি জুড়ে নিম্নলিখিত সাধারণ ধারণা ও শব্দ ব্যবহার করা হয়।

সারি ও রেকর্ড

সারি এবং রেকর্ড শব্দগুলি সাধারণত কোনও ডকুমেন্ট বা ইন্ডেক্স এন্ট্রিকে বোঝাতে ব্যবহৃত হয়।

ভেরিয়েবল

$ একটি ভেরিয়েবলকে বোঝায়, যা এক্সিকিউশন ট্রিতে তৈরি বা রেফারেন্স করা হয়। যেমন: $foo_1। এই ভেরিয়েবেলগুলি সাধারণত কোনও ডকুমেন্টের কন্টেন্ট বা কোয়েরি এক্সিকিউট করার সময় মূল্যায়ন করা এক্সপ্রেশনের ভ্যালু উল্লেখ করতে ব্যবহার করা হয়।

এক্সিকিউশন নোডে নিম্নলিখিত ইন্টার্নাল ভেরিয়েবেল দেখা যেতে পারে:

  • $__key__ - কী হল কোনও ডকুমেন্টের ইন্টার্নাল আইডেন্টিফায়ার। এটি হল প্রজেক্ট, ডেটাবেস ও ডকুমেন্টের সম্পূর্ণ পাথ সহ একটি সম্পূর্ণ, অনন্য শনাক্তকারী।
  • $__id__ - আইডি হল কোনও ডকুমেন্টের কালেকশনের মধ্যে থাকা অনন্য শনাক্তকারী। এটি একটি সংগ্রহের মধ্যে অনন্য।
  • $rid - সারি আইডি হল স্টোরেজে থাকা কোনও ডকুমেন্টের ইন্টার্নাল শনাক্তকারী। এটি একটি সংগ্রহের মধ্যে অনন্য।

একটি উদাহরণ বিবেচনা করুন যেখানে Compute নোড ব্যবহার করে __key__ ডকুমেন্ট থেকে __id__ গণনা করা হয়:

Compute
    |  $__id__1: _id($__key__)
    |  records returned: 1

সীমাবদ্ধতা ও রেঞ্জ

কিছু স্ক্যান নোড constraints এবং ranges অ্যাট্রিবিউট ব্যবহার করে স্ক্যান করা ভ্যালুর রেঞ্জ বর্ণনা করে। এই অ্যাট্রিবিউটগুলি রেঞ্জ ট্রি ফর্ম্যাট ব্যবহার করে, যার মধ্যে মানের একটি তালিকা থাকে। এইসব ভ্যালু, ইন্ডেক্স সংজ্ঞায় দেখানো কী-এর ক্রমানুসারে সাজানো তালিকার সাথে সম্পর্কিত। যেমন, ট্রিতে প্রথম যে রেঞ্জটি দেখা যায়, এখানে (1..5], সেটি প্রথম কী-এর সীমাবদ্ধতার সাথে সম্পর্কিত, এখানে a, কী-এর ক্রমানুসারে সাজানো তালিকায়:

| index: type=CollectionGroupIndex, id=CICAgOjXh#EK, keys=[a ASC, b ASC, __key__ ASC]
| constraints: /
               |----(1..5]
                    |----[1L]

ইনডেন্টেশনের প্রতিটি লেভেল তালিকার পরবর্তী 'কী'-তে প্রযোজ্য সীমাবদ্ধতা নির্দেশ করে। বর্গাকার বন্ধনী অন্তর্ভুক্তিমূলক রেঞ্জকে বোঝায়, বৃত্তাকার বন্ধনী হল এক্সক্লুসিভ রেঞ্জ। এই ক্ষেত্রে, সীমাবদ্ধতা 1 < "a" <= 5, এবং "b" = 1-এ অনুবাদ করে।

a-এর জন্য একাধিক ব্রাঞ্চ সহ নিম্নলিখিত উদাহরণে, বাধ্যবাধকতা 1 < a <= 5 OR a = 10-এর সাথে সম্পর্কিত:

| constraints: /
               |----(1L, 5L]
               |----[10L]

মূল ভেরিয়েবেল

কিছু স্ক্যান নোডে (যেমন SequentialScan), index অ্যাট্রিবিউটের অংশ হিসেবে কী-এর তালিকা এবং Scan নোডে আলাদা keys অ্যাট্রিবিউট, দুটিই থাকে। Scan নোডের keys অ্যাট্রিবিউটটি ইনডেক্স সংজ্ঞার প্রতিটি কী-এর ভেরিয়েবল নামকে ক্রমানুসারে নির্দেশ করে। এক্সিকিউশন ট্রির আরও উপরের দিকে স্ক্যান করা ফিল্ডের রানটাইম ভ্যালু রেফারেন্স করতে ভেরিয়েবল ব্যবহার করা যেতে পারে।

নিম্নলিখিত উদাহরণে, বর্তমান ডকুমেন্টের জন্য user ফিল্ডের ভ্যালু $user_1 ভেরিয়েবেলে ম্যাপ করে এবং date_placed-এর ভ্যালু $date_placed_1-এ ম্যাপ করে।

index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __key__ ASC]
keys: [user ASC, date_placed ASC, __key__ ASC]

এক্সিকিউশন নোড

কোয়েরি এক্সিকিউশন ট্রিতে নিম্নলিখিত নোড থাকতে পারে।

SeekingScan

এটি এমন একটি ডায়নামিক স্ক্যানকে দেখায় যেখানে ফেরত আসা সারিগুলি ইন্ডেক্সের একটি একক ক্রমিক রেঞ্জের মধ্যে নাও থাকতে পারে এবং কোয়েরি পূরণ করার জন্য একাধিক স্বতন্ত্র স্ক্যান করতে হবে।

যেমন, এমন একটি কোয়েরি যেখানে a আছে এবং b-এর মান 1, ["a" ASC, "b" ASC]-এর ইন্ডেক্সে কাজ করছে, সেটির ক্ষেত্রে a-এর প্রতিটি স্বতন্ত্র মানের জন্য একটি আলাদা, সম্ভাব্য নন-সিকোয়েন্সিয়াল রেঞ্জ স্ক্যান করে ফেরত দিতে হবে। এটি সম্পূর্ণ TableScan-এর থেকে বেশি দক্ষ, কিন্তু ["b" ASC, "a" ASC]-এর কম্পোজিট ইন্ডেক্সে একটি SequentialScan-এর থেকে কম দক্ষ।

• SeekingScan
| constraints: /
               |----(-∞..+∞)
                    |----[1L]
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, quantity ASC, __key__ ASC]
| keys: [user ASC, quantity ASC, __key__ ASC]
| properties: Selection { user }
| records returned: 1
| records scanned: 1

সিকোয়েন্সিয়ালস্ক্যান

স্টোরেজে সারিগুলির একটি স্ট্যাটিক, ক্রমিক রেঞ্জের স্ক্যানকে উপস্থাপন করে যা একটি একক রিড অপারেশনে সম্পাদন করা যেতে পারে।

key ordering length বলতে সেইসব 'কী'-এর সংখ্যা বোঝায় যেগুলি অবশ্যই সংরক্ষণ করতে হবে এবং মূল 'কী'-এর ক্রম অনুযায়ী ফেরত দিতে হবে। [k1, k2, k3]-এর স্কিমার জন্য, কী অর্ডারিং দৈর্ঘ্য ০ হলে, স্ক্যান যেকোনও ক্রমে ফিরে আসতে পারে, ১ হলে k1-এর ক্রম অনুযায়ী, তবে একই k1 মান সহ সারি যেকোনও ক্রমে আসতে পারে, ৩ সঠিক সাজানো ক্রমে ডকুমেন্ট ফিরিয়ে দেয়।

• SequentialScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| key ordering length: 3
| keys: [user ASC, date_placed ASC, __key__ ASC]
| limit: 10
| properties: Selection { a }
| ranges: /
| records returned: 1
| records scanned: 1

UniqueScan

স্টোরেজে সারির স্ট্যাটিক, সিকোয়েন্সিয়াল রেঞ্জের স্ক্যান দেখায়, যেখানে ইন-মেমরি ডিডুপ্লিকেশন অফ রো থাকে।

• UniqueScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| keys: [user ASC, date_placed ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
          |----(-∞..+∞)
| records returned: 1
| records scanned: 1

IndexSeek

এটি এমন একটি ডায়নামিক স্ক্যানকে দেখায় যেখানে রানটাইম ডেটা দ্বারা সারির সংখ্যা প্যারামিটারাইজ করা হতে পারে এবং ইনডেক্সের একটি একক ক্রমিক রেঞ্জ বরাবর নাও হতে পারে এবং কোয়েরি পূরণ করার জন্য একাধিক স্বতন্ত্র স্ক্যান করা হতে পারে।

যেমন, একটি কোয়েরি যেখানে user-এর মান $user_id-এর সমান এবং date_placed-এর মান "2025-08-10"-এর সমান, ["user" ASC, "date_placed" ASC]-এর ইনডেক্সে রান করলে, রানটাইমে $user_id ভেরিয়েবলের মান এবং স্ক্যান রেঞ্জ সীমাবদ্ধ করতে date_placed-এর উপর "2025-08-10"-এর সীমাবদ্ধতা ব্যবহার করবে।

• IndexSeek
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| fields: [$user_1 ASC, $date_placed_1 ASC, $rid ASC]
| key: $key_1
| filter: $eq($user_1, $user_id) AND $eq($date_placed_1, "2025-08-10")
| records returned: 1
| records scanned: 1

নিয়ে আসুন

প্রাইমারি স্টোরেজ থেকে আসল সারির কন্টেন্টে প্রদান করা সারির শনাক্তকারী ব্যাক-জয়েন করে। ডকুমেন্ট থেকে ফিল্ডের সাবসেট প্রয়োজন হলে পেরেন্ট নোড (বা চূড়ান্ত কোয়েরি ফলাফল) Fetch প্রয়োজন।

• Fetch
|  order: PRESERVE_INPUT_ORDER
|  peak memory usage: 4.00 KiB (4,096 B)
|  properties: *
|  records returned: 1

TableScan

কোনও কালেকশনের সম্পূর্ণ, ক্রমহীন স্ক্যান। সংশ্লিষ্ট ইন্ডেক্স ছাড়াই কোনও কোয়েরি রান করা হলে ব্যবহার করা হয়।

ক্রম STABLE বা UNDEFINED হতে পারে, যেখানে STABLE একটি নির্ধারক ক্রমকে বোঝায়।

• TableScan
|  order: STABLE
|  properties: *
|  records returned: 1
|  records scanned: 1
|  source: (default)#/**/collection

প্রয়োগ করুন

input-এর প্রতিটি সারির মাধ্যমে পুনরাবৃত্তি করে এবং প্রতিটি সারির জন্য, map-এর দিক থেকে ফলাফল স্ক্যান করে এবং ফেরত দিয়ে দুটি ডেটা সেটের (input এবং map) মধ্যে একটি যোগফল সম্পাদন করে।

join_type-এর মাধ্যমে যোগ দেওয়ার ধরন বোঝা যায়। যেমন, LEFT_OUTER এর অর্থ হল input-এর সব সারি আউটপুটে অন্তত একবার অন্তর্ভুক্ত করা হয়েছে। input সারি map সাইড থেকে কোনও ফলাফল খুঁজে না পেলেও, এটি অন্তর্ভুক্ত করা হবে, map সাইড থেকে কলামের জন্য null ভ্যালু সহ।

• Apply
|  join_type: LEFT_OUTER
|
└── • input tree
|     ...
└── • map tree
      ...

HashAggregate

এগ্রিগেট অপারেশনের হ্যাশ-ব্যাকড ইমপ্লিমেন্টেশন। ফলাফল দেখানোর আগে সম্পূর্ণ গ্রুপ ইন-মেমরি মেটেরিয়ালাইজ করতে হবে এবং কোয়েরি মেমরি সীমা অতিক্রম করলে চলবে না।

• HashAggregate
|  aggregations: [sum($b_1) AS total]
|  groups: [$a_1]
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 0

StreamAggregate

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

• StreamAggregate
|  keys: [foo ASC, bar ASC]
|  properties: Selection { baz }
|  aggregations: [$sum($foo_1) AS baz]

MajorSort

প্রপার্টির একটি নির্দিষ্ট সেটে সাজানোর অপারেশন পারফর্ম করে। মেমরিতে থাকা সব রেকর্ড একসাথে মেটেরিয়ালাইজ করে এবং সাজানো ভ্যালুগুলি ক্রমানুসারে দেখায়, সাজানো সেটের সাইজ কোয়েরি মেমরি সীমা দ্বারা সীমিত।

পরবর্তী সীমা প্রদান করা হলে, মেমরির ব্যবহার কমাতে টপ-k সর্টিং অ্যালগরিদম ব্যবহার করা হয়। এর সাহায্যে, k সংখ্যক বিবেচিত এলিমেন্ট স্টোর করার জন্য ব্যবহৃত মেমরি সীমা অতিক্রম না করা পর্যন্ত, রেকর্ডের একটি ইচ্ছাকৃতভাবে বড় সেটে সর্ট করা যেতে পারে।

• MajorSort
|  fields: [a ASC, b DESC]
|  limit: 10
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 1

Concat

একাধিক চাইল্ড নোডের ফলাফল একত্রিত করে এবং পেরেন্ট নোডে ফলাফল ফেরত পাঠায়। এই নোড একাধিক চাইল্ডে দেখানো ফলাফল ডুপ্লিকেট করে না এবং ফেরত আসা ফলাফলের ক্রম নির্ধারণ করা যায় না।

• Concat
├── • Fetch
...
├── • Fetch

কম্পিউট করা

এক সেট এক্সপ্রেশন মূল্যায়ন করে, ফলাফল এক সেট ভেরিয়েবেলে অ্যাসাইন করে।

• Compute
|  $user_1: user
|  $full_name_1: str_concat($first_name_1, " ", $last_name_1)
|  $address_1: UNSET
|  records returned: 1

ফিল্টার করুন

প্রদত্ত এক্সপ্রেশনের সাথে মিললে তবেই বেছে বেছে সারি দেখায়।

• Filter
|  expression: $eq(foo, "bar")
|  records returned: 1

RecordCount

চাইল্ড নোডের মাধ্যমে তৈরি করা সারির সংখ্যা গণনা করে এবং count অ্যাট্রিবিউটে উল্লেখ করা ভেরিয়েবলে বর্তমান গণনা প্রকাশ করে।

• RecordCount
|  count: $row_number_1
|  records returned: 1

ভ্যালু

কাজ করার জন্য আক্ষরিক ভ্যালুর একটি ক্রম তৈরি করে। কোনও কোয়েরির ইনপুট হিসেবে ডকুমেন্টের সেট লিস্ট প্রদান করা হলে, মূলত এটি ব্যবহার করা হয়।

• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]

আননেস্ট করুন

চাইল্ড নোডের মাধ্যমে তৈরি করা ভ্যালু আননেস্ট করে।

• Unnest
|  expression: foo AS unnested_foo

সীমা

প্যারেন্ট নোডে ফেরত আসা সারির সংখ্যা সীমিত করে।

• Limit
|  limit: 10
|  records returned: 1

অফসেট

চাইল্ড নোড দ্বারা তৈরি করা সারির একটি সেট নম্বর এড়িয়ে যায়।

• Offset
|  offset: 10
|  records returned: 1