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

فقط مربوط به نسخه Cloud Firestore Enterprise است.

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

استفاده از توضیح پرس و جو

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

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

کنسول

یک پرس و جو (query) را در ویرایشگر پرس و جو (Query Editor) اجرا کنید و تب توضیحات (Explanation) را باز کنید:

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

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

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

    تب توضیح کوئری در کنسول
رابط برنامه‌نویسی کاربردی مونگودی‌بی

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

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

db.collection.explain('executionStats').find(...)

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

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

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

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

    اگر هیچ مقداردهی اولیه‌ای ارائه نشود، پوسته از مقداردهی اولیه queryPlanner استفاده می‌کند و آمار اجرا را فیلتر می‌کند. برای مشاهده خروجی کامل، باید از مقداردهی اولیه executionStats یا allPlansExecution استفاده کنید.

تحلیل

خروجی 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

قدم بعدی چیست؟