এই পৃষ্ঠাটি Query Explain দিয়ে সম্পাদিত একটি Query এর আউটপুট ব্যাখ্যা করে। Query Explain দিয়ে কিভাবে একটি Query এক্সিকিউট করতে হয় তা জানতে, Query Explain দিয়ে Query এক্সিকিউট বিশ্লেষণ করুন দেখুন।
সাধারণ ধারণা
নিম্নলিখিত সাধারণ ধারণা এবং পদগুলি এক্সিকিউশন ট্রি জুড়ে ব্যবহৃত হয়।
সারি এবং রেকর্ড
সারি এবং রেকর্ড শব্দ দুটি সাধারণভাবে একটি নথি বা সূচী এন্ট্রি বোঝাতে ব্যবহৃত হয়।
ভেরিয়েবল
$ একটি ভেরিয়েবল নির্দেশ করে, যা এক্সিকিউশন ট্রিতে তৈরি বা রেফারেন্স করা হয়। উদাহরণস্বরূপ: $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]
এক্সিকিউশন নোড
একটি কোয়েরি এক্সিকিউশন ট্রিতে নিম্নলিখিত নোড থাকতে পারে।
সিকিংস্ক্যান
একটি গতিশীল স্ক্যান প্রতিনিধিত্ব করে যেখানে ফিরে আসা সারিগুলি সূচকের একক ক্রমিক পরিসর বরাবর নাও থাকতে পারে এবং ক্যোয়ারীটি পূরণ করার জন্য একাধিক স্বতন্ত্র স্ক্যান করতে হবে।
উদাহরণস্বরূপ, একটি কোয়েরি যেখানে 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] স্কিমার জন্য, 0 এর কী অর্ডারিং লেন্থ মানে স্ক্যান যেকোনো ক্রমে ফেরত আসতে পারে, 1 মানে k1 অনুসারে ক্রম, কিন্তু একই k1 মান সহ সারি যেকোনো ক্রমে ফেরত আসতে পারে, 3টি ডকুমেন্টকে সঠিক সাজানো ক্রমে ফেরত পাঠায়।
• 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 $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
টেবিলঅ্যাক্সেস
সরবরাহকৃত সারির শনাক্তকারীকে প্রাথমিক স্টোরেজ থেকে প্রকৃত সারির বিষয়বস্তুর সাথে ব্যাক-যোগ করে। যদি কোনও প্যারেন্ট নোড (অথবা চূড়ান্ত ক্যোয়ারী ফলাফল) ডকুমেন্ট থেকে ক্ষেত্রগুলির একটি উপসেট প্রয়োজন হয় তবে TableAccess প্রয়োজন।
• TableAccess
| order: PRESERVE_INPUT_ORDER
| peak memory usage: 4.00 KiB (4,096 B)
| properties: *
| records returned: 1
লুকআপবাই আইডি
একটি বিদেশী সংগ্রহে তাদের আইডি ব্যবহার করে ডকুমেন্টগুলি অনুসন্ধান করে একটি যোগদান সম্পাদন করে। যে আইডিগুলি সন্ধান করতে হবে তা ইনপুট ডকুমেন্টের একটি ক্ষেত্র থেকে নেওয়া হয়। অনুসন্ধানের ফলাফলগুলি ইনপুট ডকুমেন্টগুলিতে একটি নতুন ক্ষেত্র হিসাবে যুক্ত করা হয়।
• LookupById
| local_field: $localField_1
| foreign_datasource: (default)#/**/foreign
| output: $output_1
টেবিলস্ক্যান
একটি সংগ্রহের সম্পূর্ণ, অ-ক্রমিক স্ক্যান। যখন কোনও কোয়েরি কোনও সংশ্লিষ্ট সূচক ছাড়াই চালানো হয় তখন ব্যবহৃত হয়।
অর্ডার STABLE অথবা UNDEFINED হতে পারে, যেখানে STABLE একটি নির্ধারক ক্রম নির্দেশ করে।
• TableScan
| order: STABLE
| properties: *
| records returned: 1
| records scanned: 1
| source: (default)#/**/collection
নেস্টেডলুপজয়ইন
বাম ইনপুটের প্রতিটি সারির মাধ্যমে পুনরাবৃত্তি করে এবং প্রতিটি বাম সারির জন্য, join_condition এর উপর ভিত্তি করে সারিগুলির সাথে মিলের জন্য ডান ইনপুট স্ক্যান করে দুটি সেট ডেটার (বাম এবং ডান) মধ্যে একটি সংযোগ সম্পাদন করে।
join_type join এর ধরণ নির্দেশিত হয়। উদাহরণস্বরূপ, LEFT_OUTER এর অর্থ হল বাম ইনপুট থেকে সমস্ত সারি কমপক্ষে একবার আউটপুটে অন্তর্ভুক্ত করা হয়েছে। যদি join_condition উপর ভিত্তি করে বাম সারি ডান ইনপুটের কোনও সারির সাথে মেলে না, তবুও এটি অন্তর্ভুক্ত থাকবে, ডান ইনপুট থেকে কলামের জন্য নাল মান থাকবে।
• NestedLoopJoin
| join_type: LEFT_OUTER
| join_condition: $eq($left, $right)
|
└── • left tree
| ...
└── • right 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
├── • TableAccess
...
├── • TableAccess
গণনা করুন
ভেরিয়েবলের একটি সেটে ফলাফল নির্ধারণ করে, রাশির একটি সেট মূল্যায়ন করে।
• 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