این صفحه خروجی پُرسمان اجراشده با «توضیح پُرسمان» را شرح میدهد. برای آشنایی با نحوه اجرای پُرسمان با «توضیح پُرسمان»، به تجزیهوتحلیل اجرای پُرسمان با «توضیح پُرسمان» مراجعه کنید.
مفاهیم رایج
مفاهیم و اصطلاحات رایج زیر در سراسر درخت اجرا استفاده میشود.
ردیفها و سوابق
اصطلاحات ردیف و رکورد برای اشاره کلی به سند یا ورودی نمایه استفاده میشوند.
متغیر
$ نشاندهنده متغیری است که در درخت اجرا ایجاد شده یا به آن ارجاع داده شده است. برای مثال: $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: $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 پیدا نکند، همچنان
با مقادیر null برای ستونهای طرف map گنجانده خواهد شد.
• 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
گره انبوهه تخصصی که فقط وضعیت یک گروه را در هر زمان حفظ میکند و اوج استفاده از حافظه را کاهش میدهد. 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
مقدار تولیدشده توسط گره فرزند را از حالت تودرتو خارج میکند.
• Unnest
| expression: foo AS unnested_foo
حد
تعداد ردیفهای برگرداندهشده به گره اصلی را محدود میکند.
• Limit
| limit: 10
| records returned: 1
جبران کردن
تعداد مشخصی از ردیفهای تولیدشده توسط گره فرزند را رد میکند.
• Offset
| offset: 10
| records returned: 1