רלוונטי רק למהדורת Cloud Firestore Enterprise. |
כדי לפתור בעיות שקשורות לשאילתות איטיות, משתמשים בQuery Explain כדי לקבל את תוכנית הביצוע של השאילתה ואת פרופיל הביצוע בזמן הריצה. בקטע הבא מתוארים השלבים שאפשר לבצע כדי לבצע אופטימיזציה של ביצועי השאילתות בהתאם לפרופיל הביצוע:
הגבלת מספר התוצאות
כדי לזהות אם השאילתה מחזירה הרבה מסמכים, משתמשים בשדה 'רשומות שהוחזרו' בעץ הביצוע. כדאי להגביל את מספר המסמכים שמוחזרים באמצעות פסקה $limit
. כך מקטינים את גודל הבייטים של התוצאות בסדרות כשמחזירים אותן ללקוחות ברשת. במקרים שבהם הצומת Limit
קודם לצומת MajorSort
, מנוע השאילתות יכול לאחד את הצמתים Limit
ו-MajorSort
ולהחליף מימוש מלא בזיכרון ומיון במיון TopN, וכך להקטין את דרישת הזיכרון של השאילתה.
הגבלת גודל מסמך התוצאה
כדי למנוע אחזור של שדות מיותרים, כדאי להגביל את גודל המסמך שמוחזר באמצעות פסקה $project
. כך אפשר לצמצם את עלויות החישוב והזיכרון של עיבוד תוצאות ביניים, ואת גודל התוצאות בבייט אחרי הסדרות כשמחזירים אותן ללקוחות ברשת. במקרים שבהם כל השדות שאליהם מתייחסת השאילתה מכוסים על ידי אינדקס רגיל (לא אינדקס מרובה מפתחות), זה גם מאפשר לסרוק את האינדקס באופן מלא בלי צורך לאחזר מסמכים מהאחסון הראשי.
שימוש באינדקסים
כדי להגדיר אינדקסים ולבצע אופטימיזציה שלהם:
זיהוי אם השאילתה משתמשת באינדקס
כדי לזהות אם השאילתה משתמשת באינדקס, בודקים את צמתי העלה בעץ הביצוע. אם צומת העלה של עץ הביצוע הוא צומת TableScan, המשמעות היא שהשאילתה לא משתמשת באינדקס וסורקת מסמכים מהאחסון הראשי. אם נעשה שימוש באינדקס, צומת העלה של עץ הביצוע יציג את מזהה האינדקס ואת שדות האינדקס של האינדקס.
זיהוי האפשרות לאופטימיזציה של האינדקס שבו נעשה שימוש
אינדקס שימושי לשאילתה אם הוא יכול להקטין את מספר המסמכים שמנוע השאילתות צריך לאחזר מהאחסון הראשי, או אם סדר השדות שלו יכול לספק את דרישת המיון של השאילתה.
אם נעשה שימוש באינדקס בשאילתה, אבל מנוע השאילתות עדיין מאחזר ומוחק הרבה מסמכים, כפי שמצוין בצומת Scan שמחזיר הרבה רשומות ואחריו צומת Filter שמחזיר מעט רשומות, זה סימן לכך שפרדיקט השאילתה שסופק באמצעות האינדקס לא סלקטיבי. כדי ליצור אינדקס מתאים יותר, אפשר לעיין במאמר יצירת אינדקסים.
אם נעשה שימוש באינדקס שאינו אינדקס מרובה מפתחות בשאילתה, אבל מנוע השאילתות עדיין מבצע סידור מחדש בזיכרון של קבוצת התוצאות, כפי שמצוין על ידי צומת MajorSort בעץ הביצוע של השאילתה, זהו סימן לכך שאי אפשר להשתמש באינדקס כדי לספק את דרישת המיון של השאילתה. כדי ליצור אינדקס מתאים יותר, אפשר לעיין בקטע הבא.
יצירת אינדקסים
פועלים לפי ההוראות בתיעוד בנושא ניהול אינדקסים כדי ליצור אינדקסים. כדי לוודא שהשאילתה יכולה להשתמש באינדקסים, צריך ליצור אינדקסים רגילים (לא Multikey) עם שדות בסדר הבא:
- כל השדות שישמשו באופרטורים של שוויון. כדי למקסם את הסיכוי לשימוש חוזר בשאילתות, צריך לסדר את השדות בסדר יורד לפי מספר הפעמים שהם מופיעים באופרטורים של שוויון בין שאילתות.
- כל השדות שייכללו במיון (באותו הסדר).
- שדות שישמשו באופרטורים של טווח או אי-שוויון בסדר יורד של סלקטיביות אילוצי השאילתה.
- שדות שיוחזרו כחלק משאילתה באינדקס: הכללת שדות כאלה באינדקס מאפשרת לאינדקס לכסות את השאילתה ולמנוע את הצורך באחזור מסמך מהאחסון הראשי.
לשאילתות שכוללות סינון ומיון של שדות מערך, כדאי ליצור אינדקסים עם כמה מפתחות.
שימוש ברמז לשאילתה
אם יצרתם אינדקס מתאים יותר לשאילתה, אבל מנוע השאילתות לא משתמש באינדקס הזה, אתם יכולים לבטל את העדיפות של מנוע השאילתות לאינדקס באמצעות רמז לשאילתה.
מידע נוסף על הפלט של שאילתה שהופעלה באמצעות Query Explain זמין במאמר הפניה להפעלת שאילתות.