בדף הזה מובאת סקירה כללית של סינון אדפטיבי ב-AlloyDB AI, תכונה שנועדה לבצע אופטימיזציה של חיפושי וקטורים מסוננים.
מהו סינון דינמי?
סינון אדפטיבי מנתח את דפוסי השאילתות ואת התפלגויות הנתונים במהלך ביצוע השאילתות, כדי לבחור באופן דינמי את אסטרטגיית הסינון היעילה ביותר, כמו סינון מוטבע או סינון מראש.
הכלי לאופטימיזציה של שאילתות ב-AlloyDB AI משתמש בניתוח מבוסס-עלות כדי לקבוע אם סינון מוטבע או סינון מראש מספקים את הביצועים הכי טובים בכל נקודה במהלך ביצוע השאילתה.
סוג האופטימיזציה הזה תומך בחיפושי וקטורים מסוננים של AlloyDB AI, שבהם סינון אדפטיבי עובר אוטומטית בין שימוש בווקטור לבין שימוש באינדקס מטא-נתונים, ומפיק תוצאות יעילות ומדויקות ללא התערבות ידנית.
מעבר דינמי בין אסטרטגיות סינון
סינון אדפטיבי עובר באופן אוטומטי ודינמי בין אסטרטגיות של סינון מוטבע וסינון מראש במהלך ביצוע השאילתה, על סמך דפוסי שאילתות והתפלגויות נתונים בזמן אמת. אופטימיזציית השאילתות של AlloyDB AI משתמשת בניתוח מבוסס-עלויות כדי לקבוע איזו אסטרטגיה מספקת את הביצועים הטובים ביותר בכל נקודת זמן.
מסינון בתוך השורה לסינון מראש
כשהכלי לאופטימיזציה קובע שסינון מראש יעיל יותר, הסינון האדפטיבי מפעיל מעבר מסינון מוטבע לסינון מראש במהלך ההפעלה. תוכנית השאילתה משתנה באופן דינמי בהתאם לכך.
לדוגמה, התוכנית יכולה להציג Bitmap assisted pre-filtering בשדה Execution Strategy אם האופטימיזציה קובעת שבשלב הזה של השאילתה סינון מראש יהיה יעיל יותר. השינוי הדינמי הזה מתרחש כשהמערכת מתאימה את עצמה לנתונים בפועל שהיא נתקלת בהם במהלך הביצוע של השאילתה.
Limit (actual rows=10 loops=1)
-> Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
Execution Strategy: Bitmap assisted pre-filtering
Order By: (vec_col <=> '[...]'::vector)
Limit: 10
-> Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
Index Cond: (int_col <= 100000000)
כשמשתמשים ב-Execution Strategy: Bitmap assisted pre-filtering, מסנן נפרד Bitmap Index Scan מסנן קודם מערך נתונים גדול. אם הסינון המקדים הזה מצמצם את רשימת המועמדים, המערכת לא משתמשת באינדקס הווקטורי לחיפוש הסופי של הדמיון הווקטורי.
מסינון מראש לסינון בתוך השורה
בנוסף, סינון אדפטיבי יכול לעבור באופן דינמי מסינון מראש לסינון מוטבע אם אופטימיזציית השאילתות של AlloyDB AI קובעת שסינון מוטבע יעיל יותר למאפייני השאילתה הנוכחית.
במקרים כאלה, תוכנית השאילתה מותאמת באופן דינמי כדי לשקף עיבוד ישיר יותר של נתוני הווקטורים, ללא שלב סינון מראש לפני סריקת הווקטורים. יכולת ההתאמה הזו עוזרת להשיג ביצועים אופטימליים כשהתפלגות הנתונים או פרמטרים של שאילתה משתנים במהלך זמן הריצה.
לדוגמה, תוכנית השאילתה מציגה vector scan בשדה Execution Strategy כשהאופטימיזציה קובעת שאסטרטגיית סינון מוטבעת יעילה יותר עבור השאילתה הנתונה.
Limit (actual rows=10 loops=1)
-> Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
Execution Strategy: Bitmap assisted vector Scan on scann_idx
Order By: (vec_col <=> '[...]'::vector)
Limit: 10
Num Requalifications: 0
Num filtered: 1000
-> Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
Index Cond: (int_col <= 100000000)
בדוגמה הזו, Execution Strategy מציג Bitmap assisted vector Scan on scann_idx, עם Bitmap Index Scan בסיסי ב-btree_idx. המשמעות היא שהחיפוש הווקטורי משתמש במסנן מפת סיביות, שנוצר על ידי סריקת אינדקס מפת הסיביות על סמך התנאי int_col <= 100000000. לאחר מכן, Custom Scan (vector scan) מעבד רק את השורות שמזוהות על ידי מפת הסיביות הזו, ומשלב את הסינון ישירות בתהליך הסריקה של הווקטור.
דוגמה: איך סלקטיביות מפעילה מעבר דינמי
סינון אדפטיבי מבסס את ההחלטות שלו על הסלקטיביות של המסננים הרגילים. אם מסנן מסוים מסיר כמות גדולה של נתונים, סביר להניח שהכלי לאופטימיזציה יבחר בסינון מראש. אם המסנן משאיר את רוב הנתונים ללא שינוי, סביר להניח שהכלי לאופטימיזציה יבחר בסינון מוטבע.
כדי לראות את המעבר הדינמי הזה בזמן אמת, מריצים את אותה שאילתה ומשנים את הסלקטיביות של פסוקית WHERE.
לדוגמה, כשמבצעים שאילתה בטבלה גדולה של מוצרים קמעונאיים, יכול להיות שתרצו לבצע חיפוש וקטורי רק על פריטים במחיר מסוים.
סלקטיביות נמוכה
קודם כל, מחפשים מוצרים במחיר של פחות מ-1,000$. מכיוון שכמעט כל מוצר במסד הנתונים עולה פחות מ-1,000$, המסנן לא סלקטיבי במיוחד. אופטימיזציית השאילתות של AlloyDB AI קובעת שאיסוף של כמעט כל מסד הנתונים לרשימה שסוננה מראש הוא לא יעיל, ולכן היא מבצעת סריקת וקטורים מוטבעת.
אם בוחנים את תוכנית השאילתה, אפשר לראות שהמערכת התאימה את עצמה באופן דינמי למערך הנתונים העצום ובחרה בסינון מוטבע.
Limit (actual rows=10)
-> Custom Scan (vector scan)
Execution Strategy: Bitmap assisted vector Scan on scann_idx
Order By: (vec <=> '[...]'::vector)
-> Bitmap Index Scan
Index Cond: (price <= 1000)
סלקטיביות גבוהה
לאחר מכן, משנים את השאילתה כדי לחפש מוצרים במחיר של פחות מ-10$. כשהשאילתה מתחילה לפעול, אופטימיזציית השאילתות של AlloyDB AI מתכוננת בהתחלה להשתמש בסינון מוטבע. הכלי לתכנון מניח בטעות שהמסנן לא סלקטיבי במיוחד. המצב הזה קורה יותר מהצפוי כי הנתונים הסטטיסטיים שמשמשים ליצירת ההערכות האלה לא תמיד מדויקים או עדכניים. עם זאת, היא קובעת במהירות שלמסנן המחיר יש סלקטיביות גבוהה: מעט מאוד פריטים במסד הנתונים מתומחרים במחיר נמוך כזה. האופטימיזציה קובעת שאיסוף השורות המעטות האלה לפני ביצוע סריקת הווקטורים הוא מהיר הרבה יותר, ולכן היא משנה את האסטרטגיה באופן דינמי לסינון מראש.
תוכנית השאילתה משקפת את השינוי הזה בזמן אמת. המערכת בחרה לסנן מראש את מערך הנתונים הקטן לפני סריקת הווקטורים.
הבחירה הראשונית של הכלי לתכנון היקף החשיפה
Limit (actual rows=10)
-> Custom Scan (vector scan)
Execution Strategy: Bitmap assisted vector Scan on scann_idx
Order By: (vec <=> '[...]'::vector)
-> Bitmap Index Scan
Index Cond: (price <= 10)
הביצוע בפועל (החלפה דינמית)
Limit (actual rows=10)
-> Custom Scan (vector scan)
Execution Strategy: Bitmap assisted pre-filtering
Order By: (vec <=> '[...]'::vector)
-> Bitmap Index Scan
Index Cond: (price <= 10)
אתם לא צריכים לכתוב מחדש את קוד האפליקציה או לעדכן ידנית את האינדקסים של מסד הנתונים, כי חלוקת הנתונים משתנה לאורך זמן. AlloyDB AI מטפל בלוגיקת הניתוב בשבילכם בכל שאילתה, וכך מבטיח ביצועים גבוהים.