এই পৃষ্ঠাটি Query Explain-এর সাথে সম্পাদিত একটি প্রশ্নের আউটপুট ব্যাখ্যা করে। Query Explain-এর সাহায্যে কিভাবে একটি ক্যোয়ারী চালাতে হয় তা জানতে, Query Explain-এর সাথে ক্যোয়ারী এক্সিকিউশন বিশ্লেষণ দেখুন।
সাধারণ ধারণা
নিম্নোক্ত সাধারণ ধারণা এবং পদগুলি কার্যকরী গাছ জুড়ে ব্যবহৃত হয়।
সারি এবং রেকর্ড
সারি এবং রেকর্ড শব্দগুলি সাধারণভাবে একটি নথি বা সূচক এন্ট্রিকে বোঝাতে ব্যবহৃত হয়।
ভেরিয়েবল
$
একটি ভেরিয়েবলকে বোঝায়, যা এক্সিকিউশন ট্রিতে তৈরি বা উল্লেখ করা হয়েছে। উদাহরণস্বরূপ: $foo_1
। এই ভেরিয়েবলগুলি সাধারণত একটি নথির বিষয়বস্তু বা একটি ক্যোয়ারী কার্যকর করার সময় মূল্যায়ন করা একটি অভিব্যক্তির মান উল্লেখ করতে ব্যবহৃত হয়।
নিম্নলিখিত অভ্যন্তরীণ ভেরিয়েবলগুলি এক্সিকিউশন নোডগুলিতে উপস্থিত হতে পারে:
-
$__key__
-কী একটি নথির জন্য একটি অভ্যন্তরীণ শনাক্তকারী। এটি প্রকল্প, ডাটাবেস এবং নথির সম্পূর্ণ পথের সাথে একটি পরম, অনন্য শনাক্তকারী। -
$__id__
-আইডি হল তার সংগ্রহের মধ্যে থাকা একটি নথির জন্য একটি অনন্য শনাক্তকারী। এটি একটি একক সংগ্রহের মধ্যে অনন্য।
একটি উদাহরণ বিবেচনা করুন যেখানে একটি 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
টেবিল অ্যাক্সেস
প্রাথমিক সঞ্চয়স্থান থেকে প্রকৃত সারির বিষয়বস্তুতে সরবরাহকৃত সারির শনাক্তকারীর সাথে ব্যাক-মিলন করে। যদি একটি প্যারেন্ট নোড (বা চূড়ান্ত ক্যোয়ারী ফলাফল) নথি থেকে ক্ষেত্রগুলির একটি উপসেট প্রয়োজন হয় তাহলে TableAccess
প্রয়োজন।
• TableAccess
| order: PRESERVE_INPUT_ORDER
| peak memory usage: 4.00 KiB (4,096 B)
| properties: *
| records returned: 1
LookupById
তাদের আইডি দ্বারা একটি বিদেশী সংগ্রহে নথি খুঁজে একটি যোগদান সঞ্চালন. খোঁজার জন্য আইডিগুলি ইনপুট নথির একটি ক্ষেত্র থেকে নেওয়া হয়৷ অনুসন্ধানের ফলাফলগুলি ইনপুট নথিতে একটি নতুন ক্ষেত্র হিসাবে যুক্ত করা হয়েছে।
• 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
হ্যাশএগ্রিগেট
সামগ্রিক ক্রিয়াকলাপগুলির হ্যাশ-ব্যাকড বাস্তবায়ন। ফলাফল ফেরত দেওয়ার আগে সম্পূর্ণ গ্রুপ ইন-মেমরিকে বাস্তবায়িত করতে হবে এবং ক্যোয়ারী মেমরি সীমা অতিক্রম করা উচিত নয়।
• 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
মূল্যবোধ
কাজ করার জন্য আক্ষরিক মানগুলির একটি ক্রম তৈরি করে। প্রাথমিকভাবে ব্যবহৃত হয় যখন নথির একটি সেট তালিকা একটি প্রশ্নের ইনপুট হিসাবে প্রদান করা হয়।
• 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