הבנת ביצועי שאילתות באמצעות הסבר שאילתה

בעזרת Query Explain אפשר לשלוח שאילתות Cloud Firestore לקצה העורפי ולקבל נתונים סטטיסטיים מפורטים על ביצועי ביצוע השאילתות בקצה העורפי. היא פועלת כמו הפעולה EXPLAIN [ANALYZE] במערכות רבות של מסדי נתונים רלציוניים.

אפשר לשלוח בקשות להסבר שאילתה באמצעות ספריות הלקוח של שרת Firestore.

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

הסבר את השאילתה:

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

הסבר על האפשרויות של Query Explain: ברירת מחדל וניתוח

ניתן לבצע פעולות של הסבר שאילתה באמצעות האפשרות ברירת המחדל או אפשרות ניתוח.

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

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

מהי עלות הסבר לשאילתה?

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

כשמשתמשים ב-Query Explain עם האפשרות analyze, מתבצעות פעולות של הוספה לאינדקס וקריאה, כך שתחויבו על השאילתה כרגיל. אין שימוש נוסף החיוב על פעילות הניתוח, רק החיוב הרגיל לשאילתה בוצעה.

שימוש ב-Query Explain עם אפשרות ברירת המחדל

אפשר להשתמש בספריות הלקוח כדי לשלוח בקשת ברירת מחדל.

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

Java (ניהול)

Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();

    
צומת (אדמין)

const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;

    

הפורמט המדויק של התשובה תלוי בסביבת הביצוע. אפשר להמיר את התוצאות שהוחזרו ל-JSON. לדוגמה:

{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

מידע נוסף זמין בחומר העזר בנושא דוח הסבר של שאילתה.

שימוש בהסבר על שאילתה עם אפשרות הניתוח

אפשר להשתמש בספריות הלקוח כדי לשלוח בקשה לאפשרות ניתוח.

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

Java (ניהול)

Query q = db.collection("col").whereGreaterThan("a", 1);

ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();

ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();

    
צומת (אדמין)

const q = db.collection('col').where('country', '=', 'USA');

const options = { analyze : 'true' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;

    

בדוגמה הבאה מוצג האובייקט stats שמוחזר בנוסף ל-planInfo. הפורמט המדויק של התשובה תלוי בסביבת הביצוע. התגובה לדוגמה היא בפורמט JSON.

{
    "resultsReturned": "5",
    "executionDuration": "0.100718s",
    "readOperations": "5",
    "debugStats": {
               "index_entries_scanned": "95000",
               "documents_scanned": "5"
               "billing_details": {
                     "documents_billable": "5",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }

}

מידע נוסף זמין בחומר העזר בנושא דוח הסבר של שאילתה.

פירוש התוצאות וביצוע שינויים

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

לצורך המחשה, נניח את המקבילה לשאילתת ה-SQL הזו.

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

אם אנחנו משתמשים באפשרות הניתוח, המדדים המוחזרים יציגו את השאילתה פועלת בשני אינדקסים בשדה יחיד: (category ASC, __name__ ASC) (country ASC, __name__ ASC). הוא סורק 16,500 רשומות אינדקס, אבל מחזיר רק 1200 מסמכים.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

// Output query status
{
    "resultsReturned": "1200",
    "executionDuration": "0.118882s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "16500",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}

כדי לבצע אופטימיזציה של הביצועים של ביצוע השאילתה, אפשר ליצור אינדקס מורכב עם כיסוי מלא (category ASC, country ASC, __name__ ASC).

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

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, country ASC,  __name__ ASC)"}
    ]
}

// Output query stats
{
    "resultsReturned": "1200",
    "executionDuration": "0.026139s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "1200",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}