פתרון בעיות באינדקס ScaNN

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

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

רשימת שגיאות

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

שגיאה: אי אפשר ליצור אינדקס ScaNN עם טבלה ריקה

הודעת השגיאה

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

ERROR: Cannot create ScaNN index with empty table. Once the table is populated with data, create the index. See documentation to bypass this validation.

שאילתות לדוגמה שגורמות לשגיאה

  • שאילתה לדוגמה א'

    create table t1 (a INT, b VECTOR(512));
    CREATE TABLE
    create index on t1 using ScaNN(b cosine) with (num_leaves = 10, quantizer = 'sq8');
    
  • שאילתה לדוגמה ב'

    truncate t1;
    

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

שגיאה: אי אפשר ליצור אינדקס ScaNN

הודעת השגיאה

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

Cannot create ScaNN index, error: INVALID_ARGUMENT: Number of row (5) must be larger than (1000).

דוגמה לשאילתה שגורמת לשגיאה

create table t1 (a INT, b VECTOR(512));
CREATE TABLE
insert into t1 select (random()*1e9)::int, random_vector(512) from generate_series(1, 5);
INSERT 0 5
create index on t1 using scann(b cosine) with (num_leaves = 100, quantizer = 'sq8');

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

שגיאה: אי אפשר ליצור אינדקס ScaNN בטבלת מחיצות ראשית.

הודעת השגיאה

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

ERROR: Cannot create ScaNN index on parent partition table. Create ScaNN indexes on the child tables instead. See documentation to bypass this validation.

דוגמה לשאילתה שגורמת לשגיאה

create table t1 (a INT, b VECTOR(512)) partition by range(a);
CREATE TABLE
CREATE TABLE t1_one_ten PARTITION of t1 for values from (1) to (10);
CREATE TABLE
insert into t1_one_ten select (random()*1e9)::int, random_vector(512) from generate_series(1, 100);
INSERT 0 100
CREATE TABLE t1_eleven_twenty PARTITION of t1 for values from (11) to (20);
CREATE TABLE
insert into t1_eleven_twenty select (random()*1e9)::int, random_vector(512) from generate_series(1, 100);
INSERT 0 100
create index on t1 using scann(b cosine) with (num_leaves = 10, quantizer = 'sq8');

אי אפשר ליצור אינדקס ScaNN בטבלת ההורה של טבלה מחולקת למחיצות. צריך ליצור את האינדקסים של ScaNN בטבלה מחולקת למחיצות.

אכיפת יצירת אינדקס וביטול שגיאות

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

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

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

  1. מגדירים את הפרמטר scann.allow_blocked_operations creation ברמת הסשן לערך true במסד הנתונים:

    SET scann.allow_blocked_operations = true;
    
  2. מקצים את ההרשאה SUPERUSER למשתמש שיריץ את השאילתות האלה במסד הנתונים:

    CREATE USER USER_NAME WITH SUPERUSER PASSWORD PASSWORD;
    

    מחליפים את מה שכתוב בשדות הבאים:

    • USER_NAME: השם של המשתמש שרוצים לתת לו את ההרשאה.
    • PASSWORD: הסיסמה של המשתמש.