אינדקסים של Scalable Nearest Neighbors (ScaNN) ב-AlloyDB ל-PostgreSQL מאפשרים להאיץ חיפושים וקטוריים של approximate nearest neighbor בהטמעות מאוחסנות.
אינדקס ScaNN הוא אינדקס קוונטיזציה מבוסס-עץ שנוצר על ידי Google לחיפוש משוער של השכן הקרוב ביותר. הוא מספק זמן קצר יותר ליצירת אינדקס והזיכרון שבשימוש קטן יותר בהשוואה ל-HNSW. בנוסף, הוא מספק QPS מהיר יותר בהשוואה ל-HNSW, בהתאם לעומס העבודה.
לפני שמתחילים
לפני שיוצרים אינדקסים, צריך לבצע את הפעולות הבאות.
וקטורים של הטמעות נוספים לטבלה במסד הנתונים של AlloyDB.
אם תנסו ליצור אינדקס ScaNN בטבלה ריקה או בטבלה מחולקת למחיצות, יכול להיות שתיתקלו בבעיות. למידע נוסף על השגיאות שנוצרו, ראו פתרון בעיות באינדקס ScaNN. כדי ליצור אינדקס בטבלה ריקה או קטנה, קראו את המאמר יצירת אינדקס מושהה לטבלאות ריקות או כמעט ריקות.
התוספים
vectorו-alloydb_scannמותקנים:CREATE EXTENSION IF NOT EXISTS alloydb_scann CASCADE;כשמתקינים את התוסף
alloydb_scann, המערכת בודקת באופן אוטומטי אם התוסףvectorמותקן, ואם לא, היא מתקינה אותו. לא צריך להתקין אתvectorבאופן ידני בנפרד.כדי ליצור אינדקס ScaNN עם ארבע רמות, קודם צריך להפעיל את התכונה Preview במכונה של AlloyDB. כדי להפעיל את התכונה "תצוגה מקדימה", בוחרים באחת משתי השיטות הבאות:
מפעילים את הדגל לניהול מסד הנתונים
scann.enable_preview_features.מידע נוסף על הגדרת דגלים לניהול מסדי נתונים זמין במאמר הגדרת דגלים לניהול מסדי נתונים.
מגדירים את הדגל לניהול מסד הנתונים
scann.max_allowed_num_levelsלערך3ברמת הסשן או המכונה. כדי להגדיר את הדגל ברמת הסשן, מריצים את הפקודה הבאה:SET scann.max_allowed_num_levels = 3;כדי להגדיר את הדגל ברמת המכונה, מריצים את הפקודה
gcloud alloydb alloydb instances updateבאמצעות השדה--database-flags.
יצירת אינדקס בכוונון אוטומטי
אינדקסים של ScaNN בכוונון אוטומטי מפשטים את יצירת האינדקסים בכך שהם מאפשרים ל-AlloyDB לנהל ולכוונן את מבנה האינדקס. אם אתם צריכים שליטה פרטנית על כוונון האינדקס, צרו אינדקס ScaNN בכוונון ידני.
אפשר לבצע אופטימיזציה של אינדקסים בכוונון אוטומטי בשתי דרכים:
- (ברירת המחדל) זמן האחזור והאחזור של החיפוש הווקטורי על חשבון משך הזמן של תהליך ה-build של האינדקס
- איזון בין משך הזמן של תהליך ה-build של האינדקס לבין ביצועי החיפוש
כדי ליצור אינדקס ScaNN בכוונון אוטומטי, מריצים את הפקודה הבאה.
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
מחליפים את מה שכתוב בשדות הבאים:
INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה,my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
TABLE: הטבלה שאליה רוצים להוסיף את האינדקס.EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוניvector.
DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. צריך לבחור אחת מהאפשרויות:מרחק L2:
l2מכפלה סקלרית:
dot_productמרחק קוסינוס:
cosine
הפקודה הזו יוצרת אינדקס ScaNN שמותאם לביצועי החיפוש ומבצעת תחזוקת אינדקס אוטומטית. כדי לשנות את אחת מההגדרות האלה, מריצים את הפקודה הבאה:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (MODE='AUTO',
OPTIMIZATION='OPTIMIZATION',
auto_maintenance='AUTO_MAINTENANCE')
מחליפים את מה שכתוב בשדות הבאים:
INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה,my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
TABLE: הטבלה שאליה רוצים להוסיף את האינדקס.EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוניvector.
DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. צריך לבחור אחת מהאפשרויות:מרחק L2:
l2מכפלה סקלרית:
dot_productמרחק קוסינוס:
cosine
(אופציונלי)
OPTIMIZATION: מוגדר לאחת מהאפשרויות הבאות:(ברירת המחדל)
SEARCH_OPTIMIZED: אופטימיזציה של ה-recall והזמן של החיפוש הווקטורי, על חשבון זמני בנייה ארוכים יותר של האינדקס.
BALANCED: איזון בין משך הזמן של תהליך ה-build של האינדקס לבין ביצועי החיפוש.
אם מגדירים את
OPTIMIZATION, צריך לכלול גם אתMODE='AUTO'.(אופציונלי)
AUTO_MAINTENANCE: קובע אם התחזוקה האוטומטית של האינדקס מופעלת או מושבתת. מידע נוסף על תחזוקה אוטומטית זמין במאמר תחזוקה של אינדקסים וקטוריים.(ברירת מחדל)
ON: המערכת של AlloyDB מבצעת תחזוקה אוטומטית של האינדקס.OFF: AlloyDB לא מבצע תחזוקה אוטומטית של האינדקס.
יצירת אינדקס בכוונון ידני
אם לאפליקציה שלכם יש דרישות ספציפיות לגבי זמני האחזור והיצירה של האינדקס, אתם יכולים ליצור ולכוונן את האינדקס של ScaNN באופן ידני.
כדי ליצור באופן ידני אינדקס ScaNN לעמודה שמכילה הטמעות וקטורים מאוחסנות, אפשר להשתמש בפקודות הבאות.
אינדקס עץ דו-שלבי
CREATE INDEX INDEX_NAME ON TABLE USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION) WITH (mode='MANUAL', num_leaves=NUM_LEAVES_VALUE, quantizer=QUANTIZER, auto_maintenance=AUTO_MAINTENANCE);
-
INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה,my_scann_index. שמות האינדקסים משותפים במסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים. -
TABLE: הטבלה שרוצים להוסיף לה את האינדקס. -
EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני `vector`. -
DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. בוחרים באחת מהאפשרויות הבאות:- מרחק L2:
l2 - מכפלה סקלרית:
dot_product - מרחק קוסינוס:
cosine
- מרחק L2:
-
NUM_LEAVES_VALUE: מספר המחיצות שצריך להחיל על האינדקס הזה. אפשר להגדיר כל ערך בין 1 ל-100 מיליון ב-PostgreSQL מגרסה 17 ומעלה, ובין 1 ל-30 מיליון ב-PostgreSQL מגרסה 16 ומטה. מידע נוסף מופיע במאמר כוונון אינדקס שלScaNN. -
QUANTIZER: סוג הקוונטיזציה שבה משתמשים. שימו לב שאפשר לטעון את אינדקס ScaNN למנוע מבוסס-עמודות כדי להאיץ עוד יותר את החיפוש הווקטורי. בוחרים באחת מהאפשרויות הבאות:-
(ברירת מחדל)
SQ8: מספקת איזון בין ביצועי השאילתה לבין אובדן מינימלי של שליפה. בדרך כלל מדובר בפחות מ-1-2%. -
תצוגה מקדימה
AH: גיבוב אסימטרי (AH) דחוס עד פי 4 בהשוואה ל-SQ8. כדי לשפר את ביצועי השאילתות, כדאי להשתמש באפשרות הזו כשהמנוע מבוסס-העמודות מופעל ונתוני האינדקס והטבלה מאוכלסים במנוע מבוסס-העמודות. מידע נוסף זמין במאמר שיטות מומלצות לכוונון ScaNN. -
FLAT: מספק את ה-recall הגבוה ביותר, 99% או יותר, על חשבון ביצועי החיפוש.
-
(ברירת מחדל)
-
(אופציונלי)
AUTO_MAINTENANCE: קובע אם התחזוקה האוטומטית של האינדקס מופעלת או מושבתת. מידע נוסף על תחזוקה אוטומטית זמין במאמר תחזוקה של אינדקסים וקטוריים.-
(ברירת מחדל)
ON: המערכת של AlloyDB מבצעת תחזוקה אוטומטית של האינדקס. -
OFF: AlloyDB לא מבצע תחזוקה אוטומטית של האינדקס.
-
(ברירת מחדל)
אינדקס עץ תלת-שלבי
CREATE INDEX INDEX_NAME ON TABLE USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION) WITH (mode='MANUAL', num_leaves=NUM_LEAVES_VALUE, quantizer=QUANTIZER, auto_maintenance=AUTO_MAINTENANCE, max_num_levels = 2);
-
INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה,my_scann_index. שמות האינדקסים משותפים במסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים. -
TABLE: הטבלה שרוצים להוסיף לה את האינדקס. -
EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני `vector`. -
DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. בוחרים באחת מהאפשרויות הבאות:- מרחק L2:
l2 - מכפלה סקלרית:
dot_product - מרחק קוסינוס:
cosine
- מרחק L2:
-
NUM_LEAVES_VALUE: מספר המחיצות שצריך להחיל על האינדקס הזה. מגדירים ערך בין 1 ל-100 מיליון לגרסה 17 ומעלה של PostgreSQL, וערך בין 1 ל-30 מיליון לגרסה 16 ומטה של PostgreSQL. מידע נוסף מופיע במאמר כוונון אינדקס שלScaNN. -
QUANTIZER: סוג הקוונטיזציה שבה משתמשים. שימו לב שאפשר לטעון את אינדקס ScaNN למנוע מבוסס-העמודות כדי להאיץ עוד יותר את החיפוש הווקטורי. בוחרים אחת מהאפשרויות הבאות:-
(ברירת מחדל)
SQ8: מספקת איזון בין ביצועי השאילתה לבין אובדן מינימלי של שליפה. בדרך כלל מדובר בפחות מ-1-2%. -
תצוגה מקדימה
AH: גיבוב אסימטרי (AH) דחוס עד פי 4 בהשוואה ל-SQ8. כדי לשפר את ביצועי השאילתות, כדאי להשתמש באפשרות הזו כשהמנוע מבוסס-העמודות מופעל ונתוני האינדקס והטבלה מאוכלסים במנוע מבוסס-העמודות. מידע נוסף זמין במאמר שיטות מומלצות לכוונון ScaNN. -
FLAT: מספק את ה-recall הגבוה ביותר, 99% או יותר, על חשבון ביצועי החיפוש.
-
(ברירת מחדל)
-
(אופציונלי)
AUTO_MAINTENANCE: קובע אם התחזוקה האוטומטית של האינדקס מופעלת או מושבתת. מידע נוסף על תחזוקה אוטומטית זמין במאמר תחזוקה של אינדקסים וקטוריים.-
(ברירת מחדל)
ON: המערכת של AlloyDB מבצעת תחזוקה אוטומטית של האינדקס. -
OFF: AlloyDB לא מבצע תחזוקה אוטומטית של האינדקס.
-
(ברירת מחדל)
-
max_num_levels = 2: המספר המקסימלי של רמות מרכז הכובד של עץ האשכולות של K-means. מגדירים את הפרמטר הזה לערך2כדי ליצור אינדקס עם שלוש רמות.
אינדקס עץ עם ארבע רמות
CREATE INDEX INDEX_NAME ON TABLE USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION) WITH (mode='MANUAL', num_leaves=NUM_LEAVES_VALUE, quantizer=QUANTIZER, auto_maintenance=AUTO_MAINTENANCE, max_num_levels = 3);
-
INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה,my_scann_index. שמות האינדקסים משותפים במסד הנתונים. חשוב לוודא שכל שם אינדקס הוא ייחודי לכל טבלה במסד הנתונים. -
TABLE: הטבלה שרוצים להוסיף לה את האינדקס. -
EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוני `vector`. -
DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. בוחרים באחת מהאפשרויות הבאות:- מרחק L2:
l2 - מכפלה סקלרית:
dot_product - מרחק קוסינוס:
cosine
- מרחק L2:
-
NUM_LEAVES_VALUE: מספר המחיצות שצריך להחיל על האינדקס הזה. אפשר להגדיר כל ערך בין 1 ל-100 מיליון ב-PostgreSQL מגרסה 17 ומעלה, ובין 1 ל-30 מיליון ב-PostgreSQL מגרסה 16 ומטה. מידע נוסף מופיע במאמר כוונון אינדקס שלScaNN. -
QUANTIZER: סוג הקוונטיזציה שבה משתמשים. שימו לב שאפשר לטעון את אינדקס ScaNN למנוע מבוסס-העמודות כדי להאיץ עוד יותר את החיפוש הווקטורי. בוחרים אחת מהאפשרויות הבאות:-
(ברירת מחדל)
SQ8: מספקת איזון בין ביצועי השאילתה לבין אובדן מינימלי של שליפה. בדרך כלל מדובר בפחות מ-1-2%. -
תצוגה מקדימה
AH: גיבוב אסימטרי (AH) דחוס עד פי 4 בהשוואה ל-SQ8. כדי לשפר את ביצועי השאילתות, כדאי להשתמש באפשרות הזו כשהמנוע מבוסס-העמודות מופעל ונתוני האינדקס והטבלה מאוכלסים במנוע מבוסס-העמודות. מידע נוסף זמין במאמר שיטות מומלצות לכוונון ScaNN. -
FLAT: מספק את ה-recall הגבוה ביותר, 99% או יותר, על חשבון ביצועי החיפוש.
-
(ברירת מחדל)
-
(אופציונלי)
AUTO_MAINTENANCE: קובע אם התחזוקה האוטומטית של האינדקס מופעלת או מושבתת. מידע נוסף על תחזוקה אוטומטית זמין במאמר תחזוקה של אינדקסים וקטוריים.-
(ברירת מחדל)
ON: המערכת של AlloyDB מבצעת תחזוקה אוטומטית של האינדקס. -
OFF: AlloyDB לא מבצע תחזוקה אוטומטית של האינדקס.
-
(ברירת מחדל)
-
max_num_levels = 3: המספר המקסימלי של רמות מרכז הכובד של עץ האשכולות של K-means. מגדירים את הפרמטר הזה לערך3כדי ליצור אינדקס עם ארבע רמות.
המרת אינדקס שהותאם ידנית לאינדקס שמותאם אוטומטית
כדי להמיר אינדקס שהותאם ידנית לאינדקס שמותאם אוטומטית:
איפוס כל הפרמטרים של השאילתה שהוגדרו לאינדקס שהותאם ידנית.
ALTER INDEX INDEX_NAME RESET (PARAMETER_NAME);מחליפים את המשתנים הבאים:
INDEX_NAME: שם האינדקס שרוצים להמיר. לדוגמה,my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
PARAMETER_NAME: רשימה מופרדת בפסיקים שמכילה את השמות של הפרמטרים של השאילתה שרוצים לאפס. לדוגמה,num_leaves, quantization.שימו לב שצריך לאפס את כל הפרמטרים האחרים של השאילתה לפני שמאפסים את
num_leaves.
כדי להמיר אינדקס שהותאם ידנית לאינדקס שמותאם אוטומטית, צריך להוסיף אותו מחדש לאינדקס.
REINDEX INDEX CONCURRENTLY INDEX_NAME;
יצירת אינדקס ScaNN לסוגי נתונים של real[]
כדי ליצור אינדקס לעמודת הטמעה שמשתמשת בסוג הנתונים real[] במקום ב-vector, צריך להמיר את העמודה לסוג הנתונים vector:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
מחליפים את מה שכתוב בשדות הבאים:
INDEX_NAME: שם האינדקס שרוצים ליצור. לדוגמה,my_scann_index. שמות האינדקסים משותפים בכל מסד הנתונים. מוודאים שכל שם של אינדקס הוא ייחודי לכל טבלה במסד הנתונים.
TABLE: הטבלה שאליה רוצים להוסיף את האינדקס.
DIMENSIONS: מספר המאפיינים שהמודל תומך בהם.EMBEDDING_COLUMN: עמודה שבה מאוחסנים נתוניvector.
DISTANCE_FUNCTION: פונקציית המרחק שבה משתמשים באינדקס הזה. צריך לבחור אחת מהאפשרויות:מרחק L2:
l2מכפלה סקלרית:
dot_productמרחק קוסינוס:
cosine
צפייה בהתקדמות של ההוספה לאינדקס
כדי לראות את התקדמות ההוספה לאינדקס, משתמשים בתצוגה pg_stat_progress_create_index:
SELECT * FROM pg_stat_progress_create_index;
בעמודה phase מוצג המצב הנוכחי של יצירת האינדקס. אחרי ששלב בניית האינדקס מסתיים, השורה של האינדקס לא מוצגת.
יצירת אינדקס מושהה לטבלאות ריקות או לטבלאות עם מספר לא מספיק של שורות
כברירת מחדל, אי אפשר ליצור אינדקס ScaNN בטבלה ריקה או בטבלה עם פחות שורות מהערך של אפשרות האינדקס num_leaves.
כדי לעקוף את המגבלה הזו, אתם יכולים להפעיל את התכונה "יצירת אינדקס מושהה" ולאפשר ל-AlloyDB לדחות את יצירת האינדקס עד שמספר השורות בטבלה יגיע לסף שמוגדר ב-num_leaves. אחרי שהסף מגיע, AlloyDB מתחיל את בניית האינדקס ברקע.
הפעולה המושהית הזו היא תהליך שלא חוסם, ומאפשר לפעולות אחרות במסד הנתונים, כמו קריאה וכתיבה, להמשיך בלי הפרעה. מכיוון שהאינדקס נבנה מחדש ברקע, יצירת אינדקס מושהה מתאימה כשהטבלאות מטמיעות שורות נתונים בקבוצות קטנות. הבנייה מחדש של האינדקס מופעלת באופן אוטומטי אחרי שמספר השורות מגיע לסף.
עם זאת, אם אתם מתכננים להוסיף מספר גדול של שורות לטבלה בטרנזקציה אחת, מומלץ לפצל את הטרנזקציה לכמה טרנזקציות או ליצור אינדקס ScaNN בלי להפעיל את יצירת האינדקס המושהה.
הפעלת יצירת אינדקס מושהה
כדי להפעיל יצירת אינדקס מושהה:
מוודאים שהדגל
scann.enable_index_maintenanceואחד מהדגלים הבאים מופעלים:-
scann.enable_preview_features: הדגל הזה מפעיל גם תכונות אחרות בגרסת טרום-השקה (Preview). -
scann.enable_index_with_insufficient_data: הדגל הזה מפעיל באופן מפורש רק את התכונה "יצירת אינדקס מושהה".
כדי להגדיר את השימוש בהם, משתמשים ב-CLI של
gcloud:כדי להפעיל את התכונה "יצירת אינדקס מושהה" יחד עם תכונות אחרות בגרסת טרום-השקה (Preview):
gcloud alloydb instances update INSTANCE_ID \ --database-flags scann.enable_index_maintenance=on \ --database-flags scann.enable_preview_features=on \ --region=REGION_ID \ --cluster=CLUSTER_ID \ --project=PROJECT_IDכדי להפעיל באופן מפורש יצירת אינדקס מושהה בלי להפעיל תכונות אחרות בגרסת טרום-השקה (Preview):
gcloud alloydb instances update INSTANCE_ID \ --database-flags scann.enable_index_maintenance=on \ --database-flags scann.enable_index_with_insufficient_data=on \ --region=REGION_ID \ --cluster=CLUSTER_ID \ --project=PROJECT_ID
מחליפים את מה שכתוב בשדות הבאים:
-
INSTANCE_ID: המזהה של המכונה. -
REGION_ID: האזור שבו נמצאת המכונה, לדוגמהus-central1. -
CLUSTER_ID: המזהה של האשכול שבו נמצא המכונה. -
PROJECT_ID: מזהה הפרויקט שבו נמצא האשכול.
-
יוצרים אינדקס ScaNN:
כדי ליצור אינדקס בכוונון אוטומטי, צריך לציין במפורש את
WITH (MODE='AUTO')בהצהרהCREATE INDEX:CREATE INDEX INDEX_NAME ON TABLE USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION) WITH (MODE='AUTO')מידע נוסף על הפרמטרים זמין במאמר יצירת אינדקס בכוונון אוטומטי.
כדי ליצור אינדקס בכוונון ידני, מוודאים שהפרמטר
auto_maintenanceמוגדר לערךon. מידע נוסף זמין במאמר יצירת אינדקס בכוונון ידני.
מגבלות
- תהליך הרקע של יצירת אינדקס אוטומטי משתמש בערכי דגלים ברמת מסד הנתונים. גם אם מגדירים דגלים ברמת הסשן באמצעות הפקודה
SET LOCAL, התהליך מתייחס לערך הדגל שמוגדר ברמת מסד הנתונים. - אם אתם מתכננים להוסיף כמות גדולה של נתונים לטבלה ריקה בטרנזקציה אחת, מומלץ להריץ את הטרנזקציה של ההוספה הבודדת ואז ליצור אינדקס ScaNN.
אילוץ יצירת אינדקס בטבלאות ריקות או קטנות
AlloyDB משתמש באימותים כדי למנוע יצירה של אינדקס ScaNN בטבלה ריקה או בטבלה עם מעט מאוד שורות, מהסיבות הבאות:
האינדקס של ScaNN מתאמן על נתונים לא מספיקים. זה יכול לגרום לאחזור נתונים נמוך בחיפושים של דמיון וקטורי.
יכול להיות שביצועי הכתיבה במסד הנתונים ירדו.
אם הביצועים לא אופטימליים, מומלץ לדחות את יצירת האינדקס.
עם זאת, בתרחישים מסוימים של פיתוח או בדיקה, יכול להיות שתצטרכו ליצור אינדקס בטבלה ריקה או קטנה. במקרים כאלה, אפשר לאכוף יצירת אינדקס. חשוב לזכור שכדי לאלץ יצירת אינדקס, צריך הרשאות SUPERUSER.
כדי לאלץ יצירת אינדקס, צריך לבצע את הפעולות האלה:
מגדירים את הפרמטר
scann.allow_blocked_operationsברמת הסשן לערךtrueבמסד הנתונים:SET scann.allow_blocked_operations = true;אם למשתמש שאתם משתמשים בו כדי להריץ את השאילתות האלה אין הרשאות
SUPERUSER, הקצו לו אותן:CREATE USER USERNAME WITH SUPERUSER PASSWORD PASSWORD;מחליפים את המשתנים הבאים:
-
USERNAME: שם המשתמש שרוצים לתת לו הרשאותSUPERUSER. -
PASSWORD: הסיסמה של המשתמש.
-
יצירת אינדקסים במקביל
כדי ליצור את האינדקס מהר יותר, יכול להיות ש-AlloyDB יפעיל באופן אוטומטי כמה תהליכי עבודה מקבילים, בהתאם למערך הנתונים ולסוג האינדקס שבחרתם. השגיאה הזו מופיעה בדרך כלל כשיוצרים אינדקס ScaNN עם שלוש או ארבע רמות, או אם קבוצת הנתונים כוללת יותר מ-100 מיליון שורות.
למרות ש-AlloyDB מבצע אופטימיזציה אוטומטית של מספר ה-workers המקבילים, אתם יכולים לכוונן את ה-workers המקבילים באמצעות הפרמטרים הבאים של תכנון לביצוע שאילתות ב-PostgreSQL:
כדי למנוע בעיות של מחסור בזיכרון כשיוצרים את אינדקס ScaNN, ודאו שהדגלים לניהול מסד הנתונים maintenance_work_mem ו-shared_buffers מוגדרים לערך קטן יותר מסך הזיכרון של המכונה.
הרצת שאילתה
אחרי שמאחסנים את ההטמעות במסד הנתונים ומוסיפים אותן לאינדקס, אפשר להתחיל לשלוח שאילתות לגבי הנתונים. אי אפשר להריץ שאילתות חיפוש בכמות גדולה באמצעות התוסף alloydb_scann.
כדי למצוא את השכנים הסמנטיים הקרובים ביותר למחרוזת טקסט, אפשר להשתמש בפונקציה google_ml.embedding() כדי לתרגם את הטקסט לווקטור.
מכיוון שהפונקציה google_ml.embedding() מחזירה מערך אמיתי, צריך להמיר באופן מפורש את בקשה להפעלת פונקציה ל-vector לפני שמחילים אותה על אחד מהאופרטורים של השכן הקרוב ביותר, לדוגמה, <-> למרחק L2. לאחר מכן, האופרטורים האלה יכולים להשתמש באינדקס ScaNN כדי למצוא את שורות מסד הנתונים עם ההטמעות הכי דומות מבחינה סמנטית.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY
google_ml.embedding(
model_id => 'MODEL_ID',
content => 'CONTENT')::vector
LIMIT ROW_COUNT
מחליפים את המשתנים הבאים:
TABLE: הטבלה שמכילה את ההטמעה שאליה משווים את הטקסט.
EMBEDDING_COLUMN: העמודה שמכילה את ההטמעות השמורות.
DISTANCE_FUNCTION_QUERY: פונקציית המרחק שבה משתמשים בשאילתה הזו. בוחרים את השאילתה המקבילה לפונקציית המרחק שבה השתמשתם כשיצרתם את האינדקס:מרחק L2:
<->מכפלה פנימית:
<#>מרחק קוסינוס:
<=>
MODEL_ID: המזהה של מודל ההטמעה הרשום שבו רוצים להשתמש.
CONTENT: מחרוזת הטקסט שרוצים להמיר להטמעה ולחפש.
ROW_COUNT: מספר השורות שיוחזרו. לדוגמה, מציינים1אם רוצים את ההתאמה היחידה והטובה ביותר.
המאמרים הבאים
- הרצת חיפושים של דמיון וקטורי
- כוונון הביצועים של שאילתות וקטוריות
- מדדים של אינדקס וקטורי
- איך יוצרים עוזר חכם לשופינג באמצעות AlloyDB, pgvector וניהול נקודות קצה של מודלים