مرجع اجرای پرس و جو

این صفحه خروجی یک کوئری اجرا شده با 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