במאמר הזה מוסבר איך לשפר את הביצועים של השאילתות ולשפר את ההחזרה של נתונים ב-AlloyDB Omni באמצעות כוונון של האינדקסים.
לפני שמתחילים
לפני שיוצרים אינדקס ScaNN, צריך לבצע את הפעולות הבאות:
- מוודאים שטבלה עם הנתונים כבר נוצרה.
- כדי למנוע בעיות במהלך יצירת האינדקס, צריך לוודא שהערך שמוגדר לדגל
maintenance_work_memולדגלshared_buffersנמוך מזיכרון המחשב הכולל.
כוונון של אינדקס ScaNN
ההנחיות הבאות יעזרו לכם לבחור בין אינדקס ScaNN עם שתי רמות לבין אינדקס עם שלוש רמות:
- בוחרים אינדקס דו-רמתי אם מספר השורות של הווקטור קטן מ-10 מיליון שורות.
- אם מספר השורות של הווקטורים גדול מ-100 מיליון, צריך לבחור אינדקס עם שלוש רמות.
- אם מספר השורות של הווקטור הוא בין 10 מיליון ל-100 מיליון, כדאי לבחור אינדקס עם שלוש רמות כדי לבצע אופטימיזציה של משך זמן של תהליך build של האינדקס, או אינדקס עם שתי רמות כדי לבצע אופטימיזציה של אחזור נתונים בחיפוש.
בדוגמאות הבאות מוצגים אינדקסים של ScaNN בשתי רמות ובשלוש רמות, שממחישים איך מגדירים פרמטרים של אופטימיזציה לטבלה עם 1,000,000 שורות:
אינדקס דו-רמתי
SET LOCAL scann.num_leaves_to_search = 1;
SET LOCAL scann.pre_reordering_num_neighbors=50;
CREATE INDEX my-scann-index ON my-table
USING scann (vector_column cosine)
WITH (num_leaves = [power(1000000, 1/2)]);
אינדקס עם שלוש רמות
SET LOCAL scann.num_leaves_to_search = 10;
SET LOCAL scann.pre_reordering_num_neighbors=50;
CREATE INDEX my-scann-index ON my-table
USING scann (vector_column cosine)
WITH (num_leaves = [power(1000000, 2/3)], max_num_levels = 2);
ניתוח השאילתות
כדי לנתח את התובנות לגבי השאילתה, משתמשים בפקודה EXPLAIN ANALYZE, כמו בדוגמה הבאה של שאילתת SQL.
EXPLAIN ANALYZE SELECT result-column
FROM my-table
ORDER BY EMBEDDING_COLUMN <-> embedding('text-embedding-005', 'What is a database?')::vector
LIMIT 1;
תגובת הדוגמה QUERY PLAN כוללת מידע כמו הזמן שחלף, מספר השורות שנסרקו או הוחזרו והמשאבים שהיו בשימוש.
Limit (cost=0.42..15.27 rows=1 width=32) (actual time=0.106..0.132 rows=1 loops=1)
-> Index Scan using my-scann-index on my-table (cost=0.42..858027.93 rows=100000 width=32) (actual time=0.105..0.129 rows=1 loops=1)
Order By: (embedding_column <-> embedding('text-embedding-005', 'What is a database?')::vector(768))
Limit value: 1
Planning Time: 0.354 ms
Execution Time: 0.141 ms
הצגת מדדים של אינדקס וקטורים
אתם יכולים להשתמש במדדים של אינדקס הווקטורים כדי לבדוק את הביצועים של אינדקס הווקטורים, לזהות תחומים לשיפור ולשפר את האינדקס על סמך המדדים, אם צריך.
כדי לראות את כל המדדים של אינדקס הווקטורים, מריצים את שאילתת ה-SQL הבאה, שמשתמשת בתצוגה pg_stat_ann_indexes:
SELECT * FROM pg_stat_ann_indexes;
למידע נוסף על הרשימה המלאה של המדדים, אפשר לעיין במאמר מדדים של אינדקס וקטורי.