ניתוח של ביצוע שאילתה באמצעות Query Explain

בדף הזה מוסבר איך לאחזר מידע על ביצוע שאילתות כשמריצים שאילתה.

שימוש ב-Query Explain

אפשר להשתמש ב-Query Explain כדי להבין איך השאילתות מבוצעות. הדוח הזה מספק פרטים שבעזרתם אפשר לבצע אופטימיזציה של השאילתות.

אפשר להשתמש ב-Query Explain דרך מסוף Google Cloud או באמצעות הפקודה explain.

המסוף

מריצים שאילתה בעורך השאילתות ופותחים את הכרטיסייה הסבר:

  1. נכנסים לדף Databases במסוף Google Cloud.

    מעבר אל Databases

  2. ברשימת מסדי הנתונים, בוחרים מסד נתונים מסוג Cloud Firestore. ייפתח Firestore Explorer במסוף Google Cloud עבור מסד הנתונים הזה.
  3. מזינים שאילתה בעורך השאילתות ולוחצים על הפעלה.
  4. לוחצים על הכרטיסייה הסבר כדי לראות את פלט ניתוח השאילתה.

    הכרטיסייה Query Explain במסוף
MongoDB API

השאילתה Explain ב-MongoDB API נתמכת באמצעות הפקודה explain, שאפשר להשתמש בה בכלים כמו Mongo Shell ו-Compass.

הפקודה explain נתמכת בפקודות aggregate, find, distinct ו-count, למשל:

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

אפשר גם להשתמש בשיטה explain(), למשל:

db.collection.find({QUERY}).explain('executionStats')
מגבלות
חשוב לשים לב למגבלות ולשינויים הבאים:
  • הכלי Query 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 מכיל שני רכיבים עיקריים – Summary Statistics (סיכום נתונים סטטיסטיים) ו-Execution Tree (עץ הביצוע). דוגמה לשאילתה:

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

המאמרים הבאים