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

এই পৃষ্ঠাটি Query Explain দিয়ে চালানো একটি কোয়েরির আউটপুট ব্যাখ্যা করে। Query Explain দিয়ে কীভাবে একটি কোয়েরি চালাতে হয় তা জানতে, “Analyze query execution with Query Explain” দেখুন।

সাধারণ ধারণা

এক্সিকিউশন ট্রি জুড়ে নিম্নলিখিত সাধারণ ধারণা ও পরিভাষাগুলো ব্যবহৃত হয়।

সারি এবং রেকর্ড

'সারি' এবং 'রেকর্ড' শব্দ দুটি সাধারণভাবে কোনো নথি বা সূচির ভুক্তিকে বোঝাতে ব্যবহৃত হয়।

ভেরিয়েবল

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

এক্সিকিউশন নোডগুলিতে নিম্নলিখিত অভ্যন্তরীণ ভেরিয়েবলগুলি দেখা যেতে পারে:

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

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

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]

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

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

সিকিংস্ক্যান

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

উদাহরণস্বরূপ, ["a" ASC, "b" ASC] এর একটি ইনডেক্সে কাজ করার সময়, যেখানে a বিদ্যমান এবং b এর মান 1, এমন একটি কোয়েরির জন্য a এর প্রতিটি স্বতন্ত্র মানের জন্য একটি পৃথক, সম্ভাব্য অ-ক্রমিক রেঞ্জ স্ক্যান করে ফেরত দেওয়ার প্রয়োজন হবে। এটি একটি সম্পূর্ণ TableScan চেয়ে বেশি কার্যকর, কিন্তু ["b" ASC, "a" ASC] 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
| 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

ইনডেক্সসিক

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

উদাহরণস্বরূপ, ["user" ASC, "date_placed" ASC] ইনডেক্সের উপর চালিত একটি কোয়েরি, যেখানে user মান $user_id এবং date_placed মান "2025-08-10" , স্ক্যান রেঞ্জ সীমাবদ্ধ করার জন্য রানটাইমে $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

টেবিলস্ক্যান

কোনো কালেকশনের একটি সম্পূর্ণ ও অক্রমবদ্ধ স্ক্যান। এটি তখন ব্যবহৃত হয় যখন কোনো কোয়েরি সংশ্লিষ্ট ইনডেক্স ছাড়া চালানো হয়।

ক্রম হয় 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
|  aggregations: [sum($b_1) AS total]
|  groups: [$a_1]
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 0

স্ট্রিমঅ্যাগ্রিগেট

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

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

মেজরসর্ট

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

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

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

কনক্যাট

একাধিক চাইল্ড নোডের ফলাফল একত্রিত করে প্যারেন্ট নোডে ফেরত পাঠায়। এই নোডটি একাধিক চাইল্ডে থাকা ফলাফল থেকে ডুপ্লিকেট বাদ দেয় না এবং ফেরত পাঠানো ফলাফলগুলোর ক্রম অনির্দিষ্ট।

• 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

রেকর্ড সংখ্যা

চাইল্ড নোড দ্বারা উৎপাদিত সারির সংখ্যা গণনা করে এবং 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