این صفحه خروجی پُرسمان اجراشده با «توضیح پُرسمان» را شرح میدهد. برای آشنایی با نحوه اجرای پُرسمان با «توضیح پُرسمان»، به تجزیهوتحلیل اجرای پُرسمان با «توضیح پُرسمان» مراجعه کنید.
مفاهیم رایج
مفاهیم و اصطلاحات رایج زیر در سراسر درخت اجرا استفاده میشود.
ردیفها و سوابق
اصطلاحات ردیف و سند برای اشاره کلی به یک سند یا ورودی نمایه استفاده میشوند.
متغیر
$ نشاندهنده متغیری است که در درخت اجرا ایجاد شده یا به آن ارجاع داده شده است. برای مثال: $foo_1. این متغیرها معمولاً برای ارجاع به محتوای سند یا مقدار عبارتی که درطول اجرای پُرسمان ارزیابی شده است استفاده میشوند.
متغیرهای داخلی زیر میتوانند در گرههای اجرا نشان داده شوند:
$__key__- کلید شناسه داخلی سند است. این شناسه مطلق و یکتایی است که شامل پروژه، پایگاه داده، و مسیر کامل سند است.$__id__- شناسه، شناسهای یکتا برای سند در مجموعه آن است. این شناسه در یک مجموعه منحصربهفرد است.$rid- شناسه ردیف یک شناسه داخلی برای سند در فضای ذخیرهسازی است. این شناسه در یک مجموعه منحصربهفرد است.
مثالی را درنظر بگیرید که در آن از گره Compute برای محاسبه
__id__ از سند __key__ استفاده میشود:
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 وجود دارد و هم مشخصه keys جداگانهای در گره Scan وجود دارد. مشخصه
keys در گره Scan نشاندهنده نام متغیر هر کلید در
تعریف نمایه، بهترتیب است. از متغیرها میتوان برای ارجاع به مقادیر زمان اجرای فیلد اسکنشده در سطوح بالاتر درخت اجرا استفاده کرد.
در مثال زیر، مقدار فیلد 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 برابر با ۱ است و روی نمایهای از ["a" ASC, "b" ASC] کار میکند، باید برای هر مقدار متمایز a، محدوده جداگانه و احتمالاً غیرمتوالی را اسکن و برگرداند.
این کار از TableScan کامل کارآمدتر است، اما از یک
SequentialScan در نمایه ترکیبی ["b" ASC, "a" ASC] کارآمدی کمتری دارد.
• 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
Represents a dynamic scan where the rows returned may be parametrized by runtime data and might not be along a single sequential range of the index, and multiple distinct scans may be performed to satisfy the query.
برای مثال، پُرسمانی که در آن user برابر با $user_id و date_placed برابر با
"2025-08-10" است و روی نمایهای از ["user" ASC, "date_placed" ASC] اجرا میشود،
از مقدار متغیر $user_id در زمان اجرا و محدودیت "2025-08-10"
روی date_placed برای محدود کردن گسترههای اسکن استفاده میکند.
• 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: equal($user_1, $user_id) AND equal($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
LookupById
با جستجوی اسناد در مجموعه خارجی براساس شناسه آنها، پیوستن را انجام میدهد. شناسههایی که باید جستجو شوند از فیلدی در اسناد ورودی گرفته میشوند. نتایج جستوجو بهعنوان فیلد جدیدی به اسناد ورودی اضافه میشود.
• LookupById
| local_field: $localField_1
| foreign_datasource: (default)#/**/foreign
| output: $output_1
TableScan
اسکن کامل و نامرتب مجموعه. زمانی استفاده میشود که پُرسمانی بدون نمایه مرتبط اجرا شود.
ترتیب میتواند STABLE یا UNDEFINED باشد، که STABLE نشاندهنده ترتیب قطعی است.
• TableScan
| order: STABLE
| properties: *
| records returned: 1
| records scanned: 1
| source: (default)#/**/collection
NestedLoopJoin
با تکرار کردن هر ردیف ورودی سمت چپ و اسکن کردن ورودی سمت راست برای ردیفهای منطبق براساس join_condition، دو مجموعه داده (چپ و راست) را به هم میپیوندد.
join_type نوع پیوستن را نشان میدهد. برای مثال، LEFT_OUTER
یعنی همه ردیفهای ورودی سمت چپ حداقل یکبار در برونداد گنجانده شدهاند.
اگر ردیف سمت چپ با هیچ ردیفی در ورودی سمت راست براساس
join_condition مطابقت نداشته باشد، همچنان با مقادیر تهی برای ستونهای ورودی سمت راست گنجانده خواهد شد.
• NestedLoopJoin
| join_type: LEFT_OUTER
| join_condition: equal($left, $right)
|
└── • left tree
| ...
└── • right 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
گره انبوهه تخصصی که فقط وضعیت یک گروه را در هر زمان حفظ میکند و اوج استفاده از حافظه را کاهش میدهد. Used when the underlying child node will return groups sequentially. برای مثال، هنگام گروهبندی براساس مقادیر متمایز یک فیلد درحین استفاده از نمایه در آن فیلد.
• 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
مجموعهای از عبارتها را ارزیابی میکند و نتایج را به مجموعهای از متغیرها اختصاص میدهد.
• 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