این صفحه خروجی یک کوئری اجرا شده با Query Explain را توضیح می دهد. برای یادگیری نحوه اجرای یک پرس و جو با Query Explain، به تجزیه و تحلیل اجرای پرس و جو با Query Explain مراجعه کنید.
مفاهیم رایج
مفاهیم و اصطلاحات رایج زیر در سراسر درخت اجرا استفاده می شود.
ردیف ها و رکوردها
اصطلاحات ردیف و رکورد برای اشاره کلی به یک سند یا ورودی فهرست استفاده می شود.
متغیرها
$
نشان دهنده متغیری است که در درخت اجرا ایجاد یا ارجاع می شود. به عنوان مثال: $foo_1
. این متغیرها معمولاً برای اشاره به محتویات یک سند یا مقدار یک عبارت ارزیابی شده در طول اجرای یک پرس و جو استفاده می شوند.
متغیرهای داخلی زیر می توانند در گره های اجرایی ظاهر شوند:
-
$__key__
-کلید یک شناسه داخلی برای یک سند است. این یک شناسه مطلق و منحصر به فرد با پروژه، پایگاه داده و مسیر کامل سند است. -
$__id__
- شناسه یک شناسه منحصر به فرد برای یک سند در مجموعه آن است. این در یک مجموعه منحصر به فرد است.
مثالی را در نظر بگیرید که در آن از یک گره 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
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
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
ارزش ها
دنباله ای از مقادیر تحت اللفظی را برای کار کردن تولید می کند. در درجه اول زمانی استفاده می شود که مجموعه ای از اسناد به عنوان ورودی یک پرس و جو ارائه می شود.
• 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