این صفحه خروجی یک کوئری اجرا شده با Query Explain را توضیح می دهد. برای یادگیری نحوه اجرای یک پرس و جو با Query Explain، به تجزیه و تحلیل اجرای پرس و جو با Query Explain مراجعه کنید.
مفاهیم رایج
مفاهیم و اصطلاحات رایج زیر در سراسر درخت اجرا استفاده می شود.
ردیف ها و رکوردها
اصطلاحات ردیف و رکورد برای اشاره کلی به یک سند یا ورودی فهرست استفاده می شود.
متغیرها
$
نشان دهنده متغیری است که در درخت اجرا ایجاد یا ارجاع می شود. به عنوان مثال: $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
برابر با 1 است که بر روی شاخصی از ["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
SequentialScan
نشان دهنده اسکن یک محدوده ثابت و متوالی از ردیف ها در فضای ذخیره سازی است که می تواند در یک عملیات خواندن انجام شود.
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
نشاندهنده اسکن یک محدوده ثابت و متوالی از ردیفها در فضای ذخیرهسازی با حذف مجدد ردیفها در حافظه است.
• 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
نشاندهنده یک اسکن پویا است که در آن ردیفهای بازگردانده شده ممکن است توسط دادههای زمان اجرا پارامتری شوند و ممکن است در یک محدوده متوالی منفرد از ایندکس نباشند، و چندین اسکن مجزا ممکن است برای برآورده کردن پرس و جو انجام شود.
به عنوان مثال، درخواستی که در آن 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
TableAccess
شناسه ردیف ارائه شده را به محتویات ردیف واقعی از حافظه اصلی متصل می کند. اگر یک گره والد (یا نتیجه پرس و جو نهایی) به زیر مجموعه ای از فیلدها از اسناد نیاز داشته باشد، 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
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: $eq($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
گره انبوه تخصصی که فقط وضعیت را برای یک گروه در یک زمان حفظ می کند و اوج استفاده از حافظه را کاهش می دهد. زمانی استفاده می شود که گره فرزند زیربنایی گروه ها را به صورت متوالی برمی گرداند. به عنوان مثال، هنگام گروه بندی بر اساس مقادیر متمایز یک فیلد در حالی که از یک شاخص در آن فیلد استفاده می شود.
• StreamAggregate
| keys: [foo ASC, bar ASC]
| properties: Selection { baz }
| aggregations: [$sum($foo_1) AS baz]
MajorSort
یک عملیات مرتب سازی را روی یک مجموعه ثابت از ویژگی ها انجام می دهد. همه رکوردهای موجود در حافظه را به یکباره مادیت می کند و مقادیر مرتب شده را به ترتیب برمی گرداند، اندازه مجموعه مرتب سازی با محدودیت حافظه پرس و جو محدود می شود.
هنگامی که یک محدودیت بعدی ارائه می شود، یک الگوریتم مرتب سازی top-k برای کاهش استفاده از حافظه استفاده می شود. با آن، مرتبسازی میتواند روی مجموعهای دلخواه بزرگ از رکوردها انجام شود تا زمانی که حافظه مورد استفاده با ذخیره k عناصر در نظر گرفته شده از حد مجاز بیشتر نشود.
• MajorSort
| fields: [a ASC, b DESC]
| limit: 10
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 1
Concat
نتایج چندین گره فرزند را به هم متصل می کند و نتیجه را به گره والد برمی گرداند. این گره نتایجی را که در چندین فرزند ظاهر میشوند کپی نمیکند و ترتیب نتایج برگشتی غیر قطعی است.
• 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