בדף הזה מפורטות שיטות מומלצות לאינדוקס וקטורים, שמטרתן לבצע אופטימיזציה של אינדקסים של וקטורים ולשפר את תוצאות השאילתות של חיפוש השכן הקרוב המשוער (ANN).
שינוי אפשרויות החיפוש הווקטורי
הערכים האופטימליים ביותר לאפשרויות של אינדקס הווקטורים תלויים בתרחיש לדוגמה, במערך נתוני הווקטורים ובשאילתות הווקטורים. כדי להגדיר ולשנות את הערכים האלה, צריך ליצור אינדקס וקטורי חדש ולהגדיר את index_option_list בהצהרת CREATE VECTOR INDEX. יכול להיות שתצטרכו לבצע כוונון איטרטיבי כדי למצוא את הערכים הכי טובים לעומס העבודה הספציפי שלכם.
ריכזנו כאן כמה הנחיות שיעזרו לכם לבחור ערכים מתאימים:
tree_depth(רמת העץ): אם בטבלה שמוסיפים לאינדקס יש פחות מ-10 מיליון שורות, משתמשים ב-tree_depthשל2. אחרת,tree_depthשל3תומך בטבלאות עם עד כ-10 מיליארד שורות.
num_leaves: משתמשים בשורש הריבועי של מספר השורות במערך הנתונים. ערך גדול יותר יכול להאריך את משך זמן של תהליך build של אינדקס הווקטורים. מומלץ להימנע מהגדרה שלnum_leavesשגדול מ-table_row_countחלקי 1,000, כי זה יוביל לעלים קטנים מדי ולביצועים נמוכים.
num_leaves_to_search: האפשרות הזו מציינת כמה צמתי עלים של האינדקס ייבדקו. הגדלת הערך שלnum_leaves_to_searchמשפרת את ההחזרה, אבל גם מגדילה את זמן האחזור ואת העלות. מומלץ להשתמש במספר שהוא 1% ממספר העלים הכולל שמוגדר בהצהרתCREATE VECTOR INDEXבתור הערך שלnum_leaves_to_search. אם משתמשים בסעיף של מסנן, צריך להגדיל את הערך הזה כדי להרחיב את החיפוש.
אם הושגה רמת דיוק מקובלת, אבל העלות של השאילתה גבוהה מדי, מה שמוביל למקסימום נמוך של QPS, אפשר לנסות להגדיל את num_leaves באמצעות השלבים הבאים:
- מגדירים את
num_leavesככפולה k של הערך המקורי (לדוגמה,2 * sqrt(table_row_count)). - מגדירים את
num_leaves_to_searchכערך שהוא כפולה k של הערך המקורי. - כדאי לנסות להקטין את
num_leaves_to_searchכדי לשפר את העלות ואת השאילתות לשנייה (QPS) תוך שמירה על ההחזרה.
שיפור יכולת השליפה
כדי לשפר את ההיזכרות, כדאי לשנות את הערך של num_leaves_to_search או לבנות מחדש את אינדקס הווקטורים.
הגדלת הערך num_leaves_to_search
אם הערך של num_leaves_to_search קטן מדי, יכול להיות שיהיה לכם קשה יותר למצוא את השכנים הקרובים ביותר עבור חלק מווקטורי השאילתות. יצירת אינדקס וקטורי חדש עם ערך num_leaves_to_search גבוה יותר יכולה לעזור לשפר את ההחזרה על ידי חיפוש של יותר עלים. יכול להיות שהשאילתות האחרונות יכללו יותר וקטורים מאתגרים כאלה.
בנייה מחדש של אינדקס הווקטורים
מבנה העץ של אינדקס הווקטורים עובר אופטימיזציה בהתאם למערך הנתונים בזמן היצירה, והוא סטטי לאחר מכן. לכן, אם מוסיפים וקטורים שונים באופן משמעותי אחרי שיוצרים את אינדקס הווקטורים הראשוני, יכול להיות שמבנה העץ לא יהיה אופטימלי, מה שיוביל לשיעור היזכרות נמוך יותר.
כדי לבנות מחדש את אינדקס הווקטורים בלי השבתה:
- יוצרים אינדקס וקטורי חדש באותה עמודת הטמעה כמו האינדקס הווקטורי הנוכחי, ומעדכנים את הפרמטרים (לדוגמה,
OPTIONS) לפי הצורך. אחרי שתיצור את האינדקס, כדאי לבדוק איזה מבין שני האינדקסים מניב ביצועים טובים יותר. אם כן, עוברים לשלב הבא. אחרת, ממשיכים למחיקת אינדקס הווקטורים שהתיישן. מערכת Spanner מחליטה באופן אוטומטי באיזה אינדקס להשתמש בהרצת השאילתה. ב-Spanner יש שתי דרכים לציין את האינדקס שבו רוצים להשתמש. בוחרים אחת מהשיטות הבאות כדי להעריך את המדדים ולהשוות ביניהם:
א. לשנות את הבקשה: אפשר לעדכן קבוצת משנה של השאילתות כך שישתמשו ברמז
FORCE_INDEXכדי להפנות לאינדקס החדש ולעדכן את שאילתת החיפוש הווקטורי. כך מוודאים שהשאילתה משתמשת באינדקס הווקטורי החדש. אם משתמשים בשיטה הזו, יכול להיות שיהיה צורך להגדיר מחדש אתnum_leaves_to_searchבשאילתה החדשה.ב. שינוי הסכימה: אפשר להגדיר את האפשרות
disable_searchבאחד ממדדי הווקטורים. כשמגדירים את הערךtrue, Spanner משבית את אינדקס הווקטור. אפשר לעשות את זה על ידי הפעלת ההצהרהALTER VECTOR INDEXschema change:ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);השיטה הזו מונעת מ-Spanner להשתמש באינדקס הווקטורי הזה במסד הנתונים. אם יש לכם שני אינדקסים והגדרתם את האפשרות הזו באינדקס הישן, כל השאילתות ישתמשו באינדקס החדש אחרי שהשינוי בסכימה יחול. אם משתמשים ברמז
FORCE_INDEXכדי לציין אינדקס וקטורי שהאפשרותdisable_searchשלו מוגדרת לערךtrue, השאילתה תיכשל.מבטלים את האינדקס הווקטורי המיושן.
המאמרים הבאים
מידע נוסף על הפונקציות של GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE(),APPROXIMATE_DOT_PRODUCT()