שיטות מומלצות לכוונון של אינדקסים ב-ScaNN

בוחרים גרסת תיעוד:

בדף הזה מפורטות המלצות לגבי אופן הכוונון של פרמטרים של אינדקס AlloyDB Omni כדי להשיג איזון אופטימלי בין היזכרות לבין QPS. הפרמטרים המומלצים לאינדקס Scalable Nearest Neighbor ‏ (ScaNN) משתנים בהתאם לבחירה שלכם אם ליצור אינדקס עץ דו-רמתי או תלת-רמתי.

יצירת אינדקסים של ScaNN

מידע נוסף זמין במאמר בנושא הפניה לאינדקס ScaNN.

אינדקס של עץ עם שתי רמות

כדי ליישם המלצות שיעזרו לכם למצוא את הערכים האופטימליים של num_leaves ושל num_leaves_to_search עבור מערך הנתונים שלכם, פועלים לפי השלבים המומלצים הבאים:

  1. כדי ליצור את האינדקס ScaNN שעבר אופטימיזציה למקרים הבאים, מגדירים את הפרמטר num_leaves לערך הבא, כאשר rows הוא מספר השורות בטבלה שעברה אינדוקס:
    • ההגדרה balanced index build time and quality (איזון בין משך זמן של תהליך build של האינדקס לבין איכותו) מוגדרת לערך num_leaves ומשתנה לערך sqrt(rows).
    • quality (איכות) – הגדרת num_leaves (מספר העלים) לערך rows/100 (שורות חלקי 100).
  2. מריצים את שאילתות הבדיקה, ומגדילים את הערך של scann.num_of_leaves_to_search, עד שמגיעים לטווח היעד של ההחזרה – לדוגמה, 95%. מידע נוסף על ניתוח השאילתות זמין במאמר ניתוח השאילתות.
  3. חשוב לשים לב ליחס בין scann.num_leaves_to_search לבין num_leaves, שבו תשתמשו בשלבים הבאים. היחס הזה מספק קירוב לגבי מערך הנתונים שיעזור לכם להשיג את יעד ההחזרה.

    אם אתם עובדים עם וקטורים של מימדים גבוהים (500 מימדים ומעלה) ורוצים לשפר את ההחזרה, נסו לשנות את הערך של scann.pre_reordering_num_neighbors. ערך ברירת המחדל מוגדר לערך 500 * K, כאשר K הוא המגבלה שהגדרתם בשאילתה.
  4. אם ערך ה-QPS נמוך מדי אחרי שהשאילתות משיגות את ערך הזיכרון (recall) של היעד, צריך לבצע את השלבים הבאים:
    1. יוצרים מחדש את האינדקס, ומגדילים את הערכים של num_leaves ו-scann.num_leaves_to_search בהתאם להנחיות הבאות:
      • מגדירים את num_leaves לגורם גדול יותר של השורש הריבועי של מספר השורות. לדוגמה, אם האינדקס מוגדר ל-num_leaves שהוא השורש הריבועי של מספר השורות, נסו להגדיר אותו לשורש הריבועי כפול 2. אם הערך כבר מוכפל, נסו להגדיר אותו כשורש הריבועי מוכפל בשלוש.
      • מגדילים את scann.num_leaves_to_search לפי הצורך כדי לשמור על היחס שלו ל-num_leaves, שרשמתם בשלב 3.
      • מגדירים את num_leaves לערך שקטן או שווה למספר השורות חלקי 100.
    2. מריצים שוב את שאילתות הבדיקה. במהלך הרצת שאילתות הבדיקה, כדאי להתנסות בהפחתת scann.num_leaves_to_search, כדי למצוא ערך שמגדיל את QPS תוך שמירה על ערך גבוה של recall. כדאי לנסות ערכים שונים של scann.num_leaves_to_search בלי לבנות מחדש את האינדקס.
  5. חוזרים על שלב 4 עד שגם QPS וגם טווח ההחזרה מגיעים לערכים מקובלים.

אינדקס עץ עם שלוש רמות

בנוסף להמלצות לגבי אינדקס של עץ עם שתי רמות ScaNN, כדאי להיעזר בהנחיות הבאות.

כדי ליישם המלצות למציאת הערך האופטימלי של פרמטרים של אינדקס num_leaves ו-max_num_levels, פועלים לפי השלבים הבאים:

  1. יוצרים את האינדקס ScaNN עם השילובים הבאים של num_leaves ו-max_num_levels בהתאם ליעדי הביצועים:

    • משך זמן של תהליך build של אינדקס האיזון ואיכותו: מגדירים את max_num_levels כ-2 ואת num_leaves כ-power(rows, ⅔).
    • אופטימיזציה לאיכות: מגדירים את max_num_levels כ-2 ואת num_leaves כ-rows/100.
  2. מריצים את שאילתות הבדיקה. מידע נוסף על ניתוח שאילתות זמין במאמר ניתוח השאילתות.

  3. חשוב לשים לב ליחס בין scann.num_leaves_to_search ל-num_leaves, שבו תשתמשו בשלבים הבאים. היחס הזה מספק קירוב לגבי מערך הנתונים שיעזור לכם להשיג את יעד ההיזכרות.

אם אתם עובדים עם וקטורים של מאפיינים גבוהים (500 מאפיינים ומעלה) ורוצים לשפר את ההחזרה, כדאי לנסות לשנות את הערך של scann.pre_reordering_num_neighbors. ערך ברירת המחדל מוגדר לערך 500 * K, כאשר K הוא המגבלה שהגדרתם בשאילתה.

  1. אם ערך ה-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 בלי לבנות מחדש את האינדקס.
  2. חוזרים על שלב 4 עד שגם QPS וגם טווח ההחזרה מגיעים לערכים מקובלים.

תחזוקת האינדקס

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

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