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

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

שימוש ב-Query Explain

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

אפשר להשתמש ב-Query Explain דרך מסוף Firebase או באמצעות ספריות הלקוח של שרת Firestore.

המסוף
  1. במסוף Firebase, נכנסים לדף Databases and Storage > Firestore > Data > עורך השאילתות.

  2. מריצים את השאילתה שרוצים לקבל עליה מידע על הביצוע.
  3. לוחצים על הכרטיסייה Query Explain כדי לראות את פלט ניתוח השאילתה.
‫Node.js (אדמין)
import { field } from '@google-cloud/firestore/pipelines';

const q = db.pipeline()
        .collection('/users')
        .sort(field('status').ascending())
        .limit(100);
let results;
try {
    results = await q.execute({
        explainOptions: { mode: 'analyze', outputFormat: 'text' }
    });
} catch (error) {
    console.log(error);
}
const metrics = results?.explainStats?.text;

console.log(metrics);
Java (אדמין)
Pipeline q = db.pipeline()
        .collection("/users")
        .sort(field("status").ascending())
        .limit(100);

PipelineExecuteOptions pipelineOpts = new PipelineExecuteOptions().withExplainOptions(
        new ExplainOptions().withExecutionMode(ExplainOptions.ExecutionMode.ANALYZE)
);
Pipeline.Snapshot result = q.execute(pipelineOpts).get();

String metrics = null;
if (result.getExplainStats() != null) {
    metrics = result.getExplainStats().getText();
    System.out.println(metrics);
}

הסבר על המצבים

בהתאם למה שרוצים לנפות, אפשר להריץ שאילתה עם Query Explain במצבים שונים:

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

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

  • ‫stats: מתכנן ומבצע את השאילתה, אבל לא מחזיר תוצאות. מחזירה מידע על המתכנן, נתונים סטטיסטיים על זמן הריצה ומדדים.

ניתוח

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

db.pipeline().collection('/users').sort(field("status").ascending()).limit(100)

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

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

Execution:
 results returned: 2
 request peak memory usage: 20.25 KiB (20,736 B)
 data bytes read: 148 B
 entity row scanned: 2

Billing:
 read units: 1

עץ ההפעלה

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

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

במאמר אופטימיזציה של הרצת שאילתות מוסבר איך להשתמש במידע הזה כדי לבצע אופטימיזציה של השאילתות.

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

Tree:
• Compute
|  $out_1: map_set($record_1, "__name__", $__name___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 2
|   latency: 5.96 ms (local <1 ms)
|
└── • Compute
    |  $__name___1: map_get($record_1, "__key__")
    |
    |  Execution:
    |   records returned: 2
    |   latency: 5.88 ms (local <1 ms)
    |
    └── • MajorSort
        |  fields: [$v_1 ASC]
        |  output: [$record_1]
        |  limit: 100
        |
        |  Execution:
        |   records returned: 2
        |   latency: 5.86 ms (local <1 ms)
        |   peak memory usage: 20.25 KiB (20,736 B)
        |
        └── • Compute
            |  $v_1: map_get($record_1, "status")
            |
            |  Execution:
            |   records returned: 2
            |   latency: 5.23 ms (local <1 ms)
            |
            └── • TableScan
                   source: /users
                   order: UNDEFINED
                   properties: *
                   row range: (-∞..+∞)
                   output record: $record_1
                   variables: [$record_1]

                   Execution:
                    records returned: 2
                    latency: 4.68 ms
                    records scanned: 2
                    data bytes read: 148 B

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