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

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

שימוש בכלי Query Explain

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

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

המסוף

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

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

    מעבר אל Databases

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

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

הפקודה explain תומכת ב-Query Explain ב-MongoDB API, ואפשר להשתמש בה בכלים כמו 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, update, delete ו-findAndModify הן היחידות שתומכות ב-Query Explain.

  • הכלי Query Explain תומך במצבי הפירוט executionStats, allPlansExecution ו-queryPlanner.

    • queryPlanner: מחזיר רק את תוכנית ההפעלה, בלי להפעיל את השאילתה.
    • executionStats ו-allPlansExecution: מחזירה את תוכנית הביצוע יחד עם נתוני חיוב, זיכרון וביצוע.

    אם לא מציינים מצב מפורט, ברירת המחדל של המעטפת היא queryPlanner. כדי לראות את נתוני הביצוע המלאים, צריך לציין את מצב הפירוט executionStats או allPlansExecution.

ניתוח

הפלט של Query Explain מכיל שני רכיבים עיקריים: Summary Statistics (סיכום נתונים סטטיסטיים) ו-Execution Tree (עץ הביצוע). לדוגמה, ניקח את השאילתה הבאה:

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

סיכום נתונים סטטיסטיים

בחלק העליון של הפלט המוסבר מופיע סיכום של נתוני הביצוע. אפשר להשתמש בנתונים הסטטיסטיים האלה כדי לקבוע אם לשאילתה יש חביון או עלות גבוהים. הוא כולל גם נתונים סטטיסטיים לגבי הזיכרון, שמאפשרים לדעת כמה קרובה השאילתה למגבלות הזיכרון.

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

עץ הביצוע

עץ ההרצה מתאר את הרצת השאילתה כסדרה של צמתים. הצמתים התחתונים (צמתי עלים) מאחזרים נתונים משכבת האחסון, והנתונים עוברים במעלה העץ כדי ליצור תשובה לשאילתה.

פרטים על כל צומת ביצוע זמינים בחומר העזר בנושא ביצוע.

לפרטים על אופן השימוש במידע הזה כדי לבצע אופטימיזציה של השאילתות, אפשר לעיין במאמר בנושא אופטימיזציה של ביצוע שאילתות.

דוגמה לעץ ביצוע:

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

Tree:
• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 35
|   latency: 204.87 ms (local 7.64 ms)
|
└── • Compute
    |  $__id___1: _id($__key___2)
    |
    |  Execution:
    |   records returned: 35
    |   latency: 197.23 ms (local 2.04 ms)
    |
    └── • MajorSort
        |  fields: [$v_5 ASC]
        |  output: [$__key___2, $record_1]
        |
        |  Execution:
        |   records returned: 35
        |   latency: 195.20 ms (local 28.42 ms)
        |   peak memory usage: 45.56 KiB (46,656 B)
        |
        └── • Compute
            |  $v_5: offset($v_4, 0L)
            |
            |  Execution:
            |   records returned: 35
            |   latency: 166.78 ms (local 14.84 ms)
            |
            └── • Compute
                |  $v_4: sortPaths(array($date_placed_1), [date_placed ASC])
                |
                |  Execution:
                |   records returned: 35
                |   latency: 151.94 ms (local 5.43 ms)
                |
                └── • TableScan
                       source: **/orders
                       order: STABLE
                       filter: $eq($user_id_1, 1,234)
                       output bindings: {$__key___2=row().__key__, $date_placed_1=row().date_placed, $record_1=row[* - { __create_time__, __update_time__ }](), $user_id_1=row().user_id}
                       output: [$__key___2, $date_placed_1, $record_1]

                       Execution:
                        records returned: 35
                        latency: 146.50 ms
                        data bytes returned: 3.25 KiB (3,325 B)
                        post-filtered rows: 230
                        records scanned: 265
                        data bytes read: 24.58 KiB (25,175 B)

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