הסבר על סינון אדפטיבי ב-AlloyDB AI

סינון דינמי ב-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.

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

סלקטיביות נמוכה

קודם אתם מחפשים מוצרים שעולים פחות מ-4,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)

סלקטיביות גבוהה

אחר כך אתם משנים את השאילתה כדי לחפש מוצרים שעולים פחות מ-40 ש"ח. כשהשאילתה מתחילה לפעול, הכלי לאופטימיזציה של שאילתות ב-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 מטפל בלוגיקת הניתוב בכל שאילתה, כדי להבטיח ביצועים גבוהים.

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