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

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