תחזוקה של אינדקסים של וקטורים

תחזוקה של אינדקסי וקטורים של Scalable Nearest Neighbors‏ (ScaNN) ב-AlloyDB ל-PostgreSQL עוזרת לשמור על אחזור החיפוש ועל ביצועי השאילתות כשהנתונים בטבלה משתנים לאורך זמן. אתם יכולים לעקוב אחרי מדדי ההתפלגות של האינדקסים כדי לזהות שינויים בנתונים, ולהסתמך על תחזוקה אוטומטית של האינדקסים או על בנייה מחדש באופן ידני כדי לשמור על האיזון של האינדקסים הווקטוריים.

לפני שמתחילים

לפני שמנהלים את תחזוקת האינדקס, מתקינים או מעדכנים את התוספים vector ו-alloydb_scann:

  • אם התוספים vector ו-alloydb_scann לא מותקנים, מתקינים אותם.

    CREATE EXTENSION IF NOT EXISTS vector;
    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    
  • אם התוספים vector ו-alloydb_scann כבר מותקנים, מעדכנים אותם.

    ALTER EXTENSION vector UPDATE;
    ALTER EXTENSION alloydb_scann UPDATE;
    

תחזוקה אוטומטית של אינדקסים

אתם יכולים לאפשר ל-AlloyDB לנהל באופן אוטומטי את האינדקסים של הווקטורים. ככל שקבוצת הנתונים גדלה, AlloyDB מנתח ומעדכן את המרכזים ומפצל מחיצות גדולות של חריגים חשודים כטעויות. כך משתפרים באופן אוטומטי מספר השאילתות לשנייה (QPS) ואיכות תוצאות החיפוש. כל העדכונים האוטומטיים הם קבועים עד להרצת התחזוקה הבאה.

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

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

הפעלת תחזוקה אוטומטית במהלך יצירת אינדקס

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

CREATE INDEX INDEX_NAME ON TABLE_NAME \
USING scann (EMBEDDING_COLUMN_NAME DISTANCE_FUNCTION_NAME) \
WITH (mode='INDEX_MODE', num_leaves=NUM_PARTITIONS, auto_maintenance=on);

מחליפים את המשתנים הבאים:

  • ‫INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה, my_scann_index. שמות האינדקסים משותפים לכל מסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים.

  • ‫TABLE_NAME: הטבלה שרוצים להוסיף לה את האינדקס.

  • ‫EMBEDDING_COLUMN_NAME: העמודה שבה מאוחסנים נתוני ה-vector שרוצים להוסיף לאינדקס.

  • ‫DISTANCE_FUNCTION_NAME: פונקציית המרחק שבה משתמשים באינדקס הזה. צריך לבחור אחת מהאפשרויות:

    • מרחק L2: l2

    • מכפלה סקלרית: dot_product

    • מרחק קוסינוס: cosine

  • ‫INDEX_MODE: המצב שבו יוצרים את אינדקס ScaNN. אלה הערכים הזמינים:

    • ‫AUTO: המערכת של AlloyDB מנהלת ומכווננת באופן אוטומטי את מבנה האינדקס. ערך ברירת המחדל של auto_maintenance, כש-mode מוגדר כ-AUTO, הוא on.

    • ‫MANUAL: ניהול וכוונון ידני של אינדקס ScaNN. ערך ברירת המחדל של auto_maintenance, כש-mode מוגדר כ-MANUAL, הוא off.

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

  • ‫NUM_PARTITIONS: מספר המחיצות שצריך להחיל על האינדקס הזה. אפשר להגדיר כל ערך בין 1 ל-104,857,600 ל-PostgreSQL מגרסה 17 ומעלה, ובין 1 ל-30 מיליון ל-PostgreSQL מגרסה 16 ומטה. במאמר כוונון אינדקס ScaNN מוסבר איך להחליט מה יהיה הערך הזה.

הגדרת תחזוקה אוטומטית לאינדקסים קיימים

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

ALTER INDEX INDEX_NAME SET (auto_maintenance = AUTOMATIC_MAINTENANCE);

מחליפים את המשתנים הבאים:

  • ‫INDEX_NAME: שם האינדקס שרוצים לשנות. לדוגמה, my_scann_index.

  • ‫AUTOMATIC_MAINTENANCE: הפעלה או השבתה של תחזוקה אוטומטית. כדי להפעיל, צריך להגדיר את הערך on. כדי להשבית, צריך להגדיר את הערך off.

הגדלת קצב התחזוקה האוטומטית

כדי להגדיל את קצב התפוקה של התחזוקה האוטומטית, מגדירים את הדגל לניהול מסד הנתונים scann.max_background_workers. הגדלת מספר ה-background workers מגדילה את מספר האינדקסים שעוברים עיבוד בכל יחידת זמן. הוא לא מקצר את זמן העיבוד של אינדקסים ספציפיים. הערך הזה חייב להיות קטן מהערך של max_worker_processes שמוגדר לאשכול מסד הנתונים.

מידע נוסף על הגדרת דגלים לניהול מסד נתונים זמין במאמר הגדרת דגלים לניהול מסד נתונים של מכונה.

הארכת משך ההשהיה של התחזוקה האוטומטית

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

מידע נוסף על הגדרת דגלים לניהול מסד נתונים זמין במאמר הגדרת דגלים לניהול מסד נתונים של מכונה.

אחוז החיפושים של המחיצות

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

‫scann.pct_leaves_to_search מייצג את אחוז המחיצות הנוכחיות שצריך לחפש בהן. אפשר להגדיר את הפרמטר הזה לכל ערך בין 0 ל-100. ערך ברירת המחדל הוא 0, שמשבית את הפרמטר הזה ומשתמש במקום זאת בערך שמוגדר ב-scann.num_leaves_to_search. אם גם scann.num_leaves_to_search מוגדר ל-0, אז AlloyDB מוגדר כברירת מחדל ל-1% של עלים.

אם אתם צופים שקבוצת הנתונים תגדל באופן משמעותי, הגדירו את הערך הראשוני ל-1.

כדי להגדיר את scann.pct_leaves_to_search, מריצים את הפקודה הבאה:

ALTER DATABASE DB_NAME SET scann.pct_leaves_to_search = PERCENTAGE_PARTITIONS_TO_SEARCH;

מחליפים את המשתנים הבאים:

  • ‫DB_NAME: שם מסד הנתונים.

  • ‫PERCENTAGE_PARTITIONS_TO_SEARCH: אחוז המחיצות לחיפוש.

הפעלה ידנית של תחזוקת אינדקס

כדי להפעיל תחזוקה באופן ידני באינדקס מסוים, מריצים את הפקודה הבאה:

SELECT scann_index_maintenance('INDEX_NAME');

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

השבתת התחזוקה האוטומטית של אינדקסים אוטומטיים

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

CREATE INDEX similarity_index ON products
       USING scann (description_embedding cosine)
WITH (mode = 'AUTO', auto_maintenance = 'OFF');

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

בנייה מחדש של האינדקס באופן ידני

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

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

REINDEX INDEX CONCURRENTLY INDEX_NAME;

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

מידע נוסף על הוספה מחדש לאינדקס ב-PostgreSQL זמין במאמר REINDEX.

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