מידע על יצירת אינדקסים של ScaNN זמין במאמר יצירת אינדקס ScaNN.
מגבלות
לפני שמתחילים לכוונן את האינדקסים של ScaNN, חשוב להביא בחשבון את המגבלה הבאה:
num_leavesמוגבל ל-30 מיליון.
לפני שמתחילים
אם רוצים ליצור אינדקס ScaNN ברמה 4, צריך קודם להפעיל את התכונה תצוגה מקדימה במופע AlloyDB. כדי להפעיל את תכונת התצוגה המקדימה, בוחרים באחת משתי השיטות הבאות:
מפעילים את דגל מסד הנתונים
scann.enable_preview_features.מידע נוסף על הגדרת דגלים של מסד נתונים זמין במאמר הגדרת דגלים של מסד נתונים ב-AlloyDB Omni.
מגדירים את הדגל
scann.max_allowed_num_levelsשל מסד הנתונים ברמת הסשן לערך3.SET scann.max_allowed_num_levels = 3;
אינדקס של עץ עם שתי רמות
כדי ליישם המלצות שיעזרו לכם למצוא את הערכים האופטימליים של num_leaves ושל num_leaves_to_search עבור מערך הנתונים שלכם, כדאי לפעול לפי השלבים המומלצים הבאים:
- כדי ליצור את האינדקס
ScaNNשעבר אופטימיזציה למקרים הבאים, מגדירים את הפרמטרnum_leavesלערך הבא, כאשר rows הוא מספר השורות בטבלה שעברה אינדוקס:- ההגדרה balanced index build time and quality (איזון בין משך זמן של תהליך build של האינדקס לבין איכותו) מוגדרת לערך
num_leavesומשתנה לערךsqrt(rows). - quality (איכות) – הגדרת num_leaves (מספר העלים) לערך rows/100 (שורות חלקי 100).
- ההגדרה balanced index build time and quality (איזון בין משך זמן של תהליך build של האינדקס לבין איכותו) מוגדרת לערך
- מריצים את שאילתות הבדיקה, ומגדילים את הערך של
scann.num_of_leaves_to_search, עד שמגיעים לטווח היעד של ההחזרה – לדוגמה, 95%. מידע נוסף על ניתוח השאילתות זמין במאמר ניתוח השאילתות. - חשוב לשים לב ליחס בין
scann.num_leaves_to_searchלביןnum_leaves, שבו תשתמשו בשלבים הבאים. היחס הזה מספק קירוב לגבי מערך הנתונים שיעזור לכם להשיג את יעד ההחזרה.
אם אתם עובדים עם וקטורים של מימדים גבוהים (500 מימדים ומעלה) ורוצים לשפר את ההחזרה, נסו לשנות את הערך שלscann.pre_reordering_num_neighbors. ערך ברירת המחדל מוגדר לערך50 * K, כאשרKהוא המגבלה שהגדרתם בשאילתה. - אם ערך ה-QPS נמוך מדי אחרי שהשאילתות משיגות את ערך הזיכרון (recall) של היעד, צריך לבצע את השלבים הבאים:
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
num_leavesו-scann.num_leaves_to_searchבהתאם להנחיות הבאות:- מגדירים את
num_leavesלגורם גדול יותר של השורש הריבועי של מספר השורות. לדוגמה, אם האינדקס מוגדר ל-num_leavesשהוא השורש הריבועי של מספר השורות, נסו להגדיר אותו לשורש הריבועי כפול 2. אם הערך כבר מוכפל, נסו להגדיר אותו כשורש הריבועי מוכפל בשלוש. - מגדילים את
scann.num_leaves_to_searchלפי הצורך כדי לשמור על היחס שלו ל-num_leaves, שרשמתם בשלב 3. - מגדירים את
num_leavesלערך שקטן או שווה למספר השורות חלקי 100.
- מגדירים את
- מריצים שוב את שאילתות הבדיקה.
במהלך הרצת שאילתות הבדיקה, כדאי להתנסות בהפחתת
scann.num_leaves_to_search, כדי למצוא ערך שמגדיל את QPS תוך שמירה על ערך גבוה של recall. כדאי לנסות ערכים שונים שלscann.num_leaves_to_searchבלי לבנות מחדש את האינדקס.
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
- חוזרים על שלב 4 עד שגם QPS וגם טווח ההחזרה מגיעים לערכים מקובלים.
אינדקס עץ עם שלוש רמות
בנוסף להמלצות לגבי אינדקס של עץ עם שתי רמות ScaNN, כדאי להיעזר בהנחיות הבאות.
כדי ליישם המלצות למציאת הערך האופטימלי של פרמטרים של אינדקס num_leaves ו-max_num_levels, פועלים לפי השלבים הבאים:
יוצרים את האינדקס
ScaNNעם השילובים הבאים שלnum_leavesו-max_num_levelsבהתאם ליעדי הביצועים:- משך זמן של תהליך build של אינדקס האיזון ואיכותו: מגדירים את
max_num_levelsכ-2ואתnum_leavesכ-power(rows, ⅔). - אופטימיזציה לאיכות: מגדירים את
max_num_levelsכ-2ואתnum_leavesכ-rows/100.
- משך זמן של תהליך build של אינדקס האיזון ואיכותו: מגדירים את
מריצים את שאילתות הבדיקה. מידע נוסף על ניתוח שאילתות זמין במאמר ניתוח השאילתות.
חשוב לשים לב ליחס בין
scann.num_leaves_to_searchל-num_leaves, שבו תשתמשו בשלבים הבאים. היחס הזה מספק קירוב לגבי מערך הנתונים שיעזור לכם להשיג את יעד ההיזכרות.
אם אתם עובדים עם וקטורים של מאפיינים גבוהים (500 מאפיינים ומעלה) ורוצים לשפר את ההחזרה, כדאי לנסות לשנות את הערך של scann.pre_reordering_num_neighbors. ערך ברירת המחדל מוגדר לערך 50 * K, כאשר K הוא המגבלה שהגדרתם בשאילתה.
אם ערך ה-QPS נמוך מדי אחרי שהשאילתות משיגות את ערך הזיכרון הרצוי, פועלים לפי השלבים הבאים:
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
num_leavesושלscann.num_leaves_to_searchבהתאם להנחיות הבאות: - מגדירים את
num_leavesלגורם גדול יותר שלpower(rows, ⅔). לדוגמה, אם האינדקס מוגדר ל-num_leaves, נסו להגדיר אותו ל-power(rows, ⅔)כפול.power(rows, ⅔)אם הערך כבר הוכפל, נסו להגדיר אותו כמשולש שלpower(rows, ⅔). - מגדילים את
scann.num_leaves_to_searchלפי הצורך כדי לשמור על היחס שלו ל-num_leaves, שציינתם בשלב 3. - צריך להגדיר ל-
num_leavesערך שקטן מ-rows/100או שווה לו. - מריצים שוב את שאילתות הבדיקה. במהלך הרצת שאילתות הבדיקה, כדאי להתנסות בהפחתת
scann.num_leaves_to_search, כדי למצוא ערך שמגדיל את QPS תוך שמירה על ערך גבוה של recall. אפשר לנסות ערכים שונים שלscann.num_leaves_to_searchבלי לבנות מחדש את האינדקס.
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
חוזרים על שלב 4 עד שגם QPS וגם טווח ההחזרה מגיעים לערכים מקובלים.
מדד עץ עם ארבע רמות
בנוסף להמלצות לגבי אינדקסים של עץ ברמה 3, אפשר להשתמש בהנחיות הבאות כדי למצוא את הערך האופטימלי של num_leaves ושל max_num_levels:
יוצרים אינדקס ScaNN עם השילובים הבאים של
num_leavesו-max_num_levelsבהתאם ליעדי הביצועים:איזון בין משך זמן של תהליך build של האינדקס לבין האיכות: מגדירים את
max_num_levelsל-3ואתnum_leavesל-power(ROWS, 3/4).אופטימיזציה לאיכות: מגדירים את
max_num_levelsל-3ואתnum_leavesל-ROWS/100.
מריצים את שאילתות הבדיקה. מידע נוסף על ניתוח שאילתות זמין במאמר ניתוח השאילתות.
חשוב לשים לב ליחס בין
scann.num_leaves_to_searchלביןnum_leaves. משתמשים ביחס הזה כדי להשיג את יעד ההיזכרות בשלבים הבאים.אם אתם עובדים עם וקטורים של מאפיינים גבוהים (500 מאפיינים ומעלה) ואתם רוצים לשפר את ההחזרה, נסו לשנות את הערך של
scann.pre_reordering_num_neighbors.אם ערך השאילתות לשנייה נמוך מדי אחרי שהשאילתות משיגות יעד של אחזור, צריך ליצור מחדש את האינדקס ולהגדיל את הערך של
num_leavesושלscann.num_leaves_to_searchבהתאם להנחיות הבאות:מגדירים את
num_leavesכגורם גדול יותר שלpower(ROWS, 3/4). לדוגמה, אם הערך שלnum_leavesבאינדקס הואpower(ROWS, 3/4), נסו להגדיר אותו כפול מהערך הזה. אם הערך כבר הוכפל, נסו לשלש אותו.מגדילים את
scann.num_leaves_to_searchלפי הצורך כדי לשמור על היחס שלו ל-num_leaves, שציינתם בשלב שלוש.צריך להגדיר את
num_leavesלערך שקטן מ-ROWS/100או שווה לו.מריצים שוב את שאילתות הבדיקה. בזמן שאתם מריצים את שאילתות הבדיקה, כדאי לנסות לצמצם את
scann.num_leaves_to_search. מוצאים ערך שמגדיל את מספר הבקשות לשנייה (QPS) תוך שמירה על שיעור גבוה של היזכרות. אפשר לנסות ערכים שונים שלscann.num_leaves_to_searchבלי לבנות מחדש את האינדקס.
חוזרים על שלב 4 עד שטווח ההחזרה וה-QPS מגיעים לערכים מקובלים.
שיפור יכולת השליפה של תוצאות חיפוש מסוננות
כשמבצעים חיפוש וקטורי של k-שכנים קרובים (KNN) שכולל מסנן, יכול להיות שהשאילתה תחזיר פחות תוצאות מהמספר שצוין בסעיף LIMIT. מצב כזה יכול להוביל למה שנקרא היזכרות לא מספקת, והוא סביר יותר כשמשתמשים במסננים סלקטיביים מאוד. זה קורה כי המחיצות הראשוניות, או העלים, ש-ScaNN מחפש בהן לא מכילות מספיק וקטורים שעומדים בתנאי הסינון.
כדי לפתור את הבעיה הזו, ב-AlloyDB Omni יש תכונה שמאפשרת להרחיב באופן דינמי את החיפוש מעבר לקבוצת העלים הראשונית, כדי למצוא מספיק תוצאות תואמות.
איך סטרימינג עובד
כדי להפעיל את פונקציונליות הסטרימינג, צריך להגדיר את הפרמטר scann.satisfy_limit לערך relaxed_order. כשהתכונה הזו מופעלת, הסריקה הווקטורית ממשיכה לחפש במחיצות עלים נוספות עד שהיא מוצאת מספיק תוצאות כדי לענות על LIMIT של השאילתה, וכך משפרת את ההחזרה.
כדי למנוע מצב שבו החיפוש נמשך יותר מדי זמן ולשלוט בהשפעה על הביצועים, אפשר להשתמש בפרמטר scann.max_pct_leaves_to_search. ההגדרה הזו פועלת כמנגנון הגנה, כי היא מגדירה רף עליון לאחוז העלים הכולל שאפשר לבקר בהם בשאילתה. ערך ברירת המחדל הוא 15%.
מתי כדאי להשתמש בסטרימינג
כדאי להשתמש בתכונת הסטרימינג במקרים הבאים:
- אתם משתמשים במסננים בחיפושים וקטוריים.
- השאילתות מחזירות פחות תוצאות מהצפוי על סמך סעיף
LIMIT.
אם מפעילים את האפשרות scann.satisfy_limit, אפשר לשפר את ההחזרה של תוצאות החיפוש המסוננות. מומלץ גם להגדיר את scann.max_pct_leaves_to_search כדי להגיע לאיזון בין היזכרות לבין ביצועי שאילתות.
תחזוקת האינדקס
אם הטבלה שלכם נוטה להתעדכן או להוסיף נתונים לעיתים קרובות, מומלץ ליצור מחדש את האינדקס הקיים ScaNN באופן תקופתי כדי לשפר את דיוק האחזור.
אתם יכולים לעקוב אחרי מדדי האינדקס כדי לראות שינויים בהתפלגויות הווקטורים או במוטציות הווקטורים מאז בניית האינדקס, ואז לבצע אינדוקס מחדש בהתאם. מידע נוסף על מדדים זמין במאמר הצגת מדדים של אינדקס וקטורים.