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

এই পৃষ্ঠায় Query Explain-এর মাধ্যমে এক্সিকিউট করা কোয়েরির আউটপুট ব্যাখ্যা করা হয়েছে। 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

SequentialScan

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

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