בדף הזה מוסבר איך לאחזר מידע על ביצוע שאילתות כשמריצים שאילתה.
שימוש ב-Query Explain
כדי להבין איך השאילתות מבוצעות, אפשר להשתמש בכלי Query Explain. הפרטים האלה יכולים לעזור לכם לבצע אופטימיזציה של השאילתות.
אפשר להשתמש ב-Query Explain דרך מסוף Firebase או באמצעות ספריות הלקוח של שרת Firestore.המסוף
-
במסוף Firebase, עוברים אל Databases and Storage (מסדי נתונים ואחסון) > Firestore > Data (נתונים) > Query Editor (עורך שאילתות).
- מריצים את השאילתה שרוצים לקבל עליה מידע על הביצוע.
- לוחצים על הכרטיסייה 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 מכיל שני רכיבים עיקריים – סיכום הנתונים הסטטיסטיים ועץ הביצוע. לדוגמה, השאילתה הבאה:
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
המאמרים הבאים
- מידע על הצמתים בעץ ההרצה זמין בחומר העזר בנושא הרצת שאילתות.
- במאמר אופטימיזציה של ביצוע שאילתות מוסבר איך לבצע אופטימיזציה של השאילתות.