اجرای پرس و جو را با Query Explain تجزیه و تحلیل کنید

فقط مربوط به Cloud Firestore Enterprise edition.

این صفحه نحوه بازیابی اطلاعات اجرای پرس و جو را هنگام اجرای پرس و جو توضیح می دهد.

از Query Explin استفاده کنید

می توانید از Query Explain برای درک نحوه اجرای پرس و جوهای خود استفاده کنید. این جزئیاتی را ارائه می دهد که می توانید از آنها برای بهینه سازی درخواست های خود استفاده کنید.

می توانید از Query Explain از طریق کنسول Google Cloud یا دستور explain استفاده کنید.

کنسول

یک پرس و جو را در ویرایشگر Query اجرا کنید و تب توضیح را باز کنید:

  1. در کنسول Google Cloud، به صفحه پایگاه داده بروید.

    به پایگاه داده بروید

  2. از لیست پایگاه‌های داده، یک پایگاه‌داده Cloud Firestore با سازگاری MongoDB را انتخاب کنید. کنسول Google Cloud، Firestore Explorer را برای آن پایگاه داده باز می کند.
  3. یک درخواست را در ویرایشگر پرس و جو وارد کنید و روی Run کلیک کنید.
  4. برای مشاهده خروجی تحلیل پرس و جو، روی تب توضیح کلیک کنید.

    زبانه توضیح درخواست در کنسول
MongoDB API

Query Explain در MongoDB API از طریق دستور explain پشتیبانی می شود که می توانید از آن در ابزارهایی مانند Mongo Shell و Compass استفاده کنید.

دستور explain با دستورات aggregate ، find ، distinct و count پشتیبانی می شود، به عنوان مثال:

db.collection.explain.find(...)

همچنین می توانید از متد explain() استفاده کنید، برای مثال:

db.collection.find({QUERY}).explain()
محدودیت ها
به محدودیت ها و تفاوت های زیر توجه کنید:
  • Query Explain از دستوراتی که مکان نما را برمی گرداند پشتیبانی نمی کند. برای مثال، فراخوانی توضیح با فراخوانی مستقیم دستور زیر پشتیبانی نمی‌شود:

    db.collection.aggregate(..., explain: true)
  • Query Explain فقط در دستورات find ، aggregate ، count و distinct پشتیبانی می‌شود.

  • گزینه‌های Verbosity و Comment Query Explain از طریق MongoDB API پشتیبانی نمی‌شوند. رفتار با گزینه executionStats مطابقت دارد. در صورت ارائه گزینه‌های allPlansExecution و queryPlanner نادیده گرفته می‌شوند.

تجزیه و تحلیل

خروجی Query Explain شامل دو جزء اصلی خلاصه آمار و درخت اجرا است. این پرس و جو را به عنوان مثال در نظر بگیرید:

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

آمار خلاصه

بالای خروجی توضیح داده شده شامل خلاصه ای از آمار اجرا است. از این آمار برای تعیین اینکه آیا یک پرس و جو دارای تاخیر یا هزینه بالایی است استفاده کنید. همچنین حاوی آمار حافظه است که به شما اطلاع می دهد که درخواست شما تا چه حد به محدودیت های حافظه نزدیک است.

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

درخت اعدام

درخت اجرا، اجرای پرس و جو را به عنوان یک سری از گره ها توصیف می کند. گره‌های پایین (گره‌های برگ) داده‌ها را از لایه ذخیره‌سازی بازیابی می‌کنند که از درخت عبور می‌کند تا یک پاسخ پرس و جو ایجاد کند.

برای جزئیات در مورد هر گره اجرایی، به مرجع اجرا مراجعه کنید.

برای جزئیات بیشتر در مورد نحوه استفاده از این اطلاعات برای بهینه سازی پرس و جوها، به بهینه سازی اجرای پرس و جو مراجعه کنید.

در زیر نمونه ای از درخت اجرا آمده است:

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

بعدش چی