המנוע מבוסס-העמודות של AlloyDB ל-PostgreSQL מאפשר להאיץ חיפושים וקטוריים שמשתמשים באינדקסים של Scalable Nearest Neighbors (ScaNN) או של Hierarchical Navigable Small World (HNSW). המנוע מבוסס-העמודות שומר במטמון אינדקסים של וקטורים בייצוג בזיכרון שעבר אופטימיזציה לקריאה, וכך הוא מציג שאילתות ישירות מהזיכרון ומגדיל את מספר השאילתות לשנייה (QPS) בעומסי עבודה של חיפוש וקטורי.
אפשר להשתמש ב-HNSW עם מנוע מבוסס-עמודות רק באשכולות של AlloyDB שפועלים עם PostgreSQL מגרסה 17 ואילך. ב-ScaNN עם מנוע מבוסס-עמודות אין מגבלה כזו.
לפני שמתחילים
מגדירים את הדגלים
google_columnar_engine.enabledו-google_columnar_engine.enable_index_cachingלניהול מסד הנתונים לערךonכדי להפעיל את המנוע מבוסס-העמודות ואת התכונה שלו לשמירת אינדקסים במטמון.gcloud alloydb instances update INSTANCE_ID \ --database-flags google_columnar_engine.enabled=on,google_columnar_engine.enable_index_caching=on \ --region=REGION \ --cluster=CLUSTER_ID \ --project=PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
INSTANCE_ID: המזהה של המכונה שבה רוצים להפעיל את המנוע מבוסס-העמודות. -
REGION: האזור שבו נמצא המכונה, לדוגמהus-central1. -
CLUSTER_ID: המזהה של האשכול שבו נמצא המכונה. -
PROJECT_ID: מזהה הפרויקט שבו נמצא האשכול.
מידע נוסף על הגדרת דגלים זמין במאמר הגדרת דגלים של מסדי נתונים.
-
יוצרים אינדקס ScaNN או יוצרים אינדקס HNSW במסד הנתונים.
הוספת אינדקס למנוע מבוסס-העמודות
אחרי שמפעילים את המנוע מבוסס-העמודות, אפשר להוסיף אינדקס קיים למטמון באמצעות הפונקציה google_columnar_engine_add_index() ב-SQL.
כדי להוסיף אינדקס למנוע מבוסס-העמודות:
נכנסים לדף Clusters במסוף Google Cloud .
כדי להציג את הדף Overview של האשכול, לוחצים על שם האשכול של AlloyDB בעמודה Resource name.
בחלונית הניווט, לוחצים על AlloyDB Studio.
נכנסים ל-AlloyDB Studio באמצעות שם מסד הנתונים, שם המשתמש והסיסמה.
בכרטיסייה Editor 1, מזינים את השאילתה הבאה:
SELECT google_columnar_engine_add_index('INDEX_NAME');מחליפים את
INDEX_NAMEבשם של אינדקס הווקטורים.- לוחצים על Run.
אחרי שמוסיפים אינדקס למנוע מבוסס-העמודות, כל השאילתות שמשתמשות באינדקס הזה מואצות באופן אוטומטי על ידי המנוע מבוסס-העמודות. כדי לוודא שהמנוע מבוסס-העמודות מאיץ את השאילתות הווקטוריות, אתם יכולים להשתמש בתוכנית EXPLAIN (ANALYZE, COLUMNAR_ENGINE) בשאילתה.
אימות השימוש במטמון
כדי לוודא שהמנוע מבוסס-העמודות מאיץ את השאילתות הווקטוריות, אתם יכולים להשתמש בתוכנית EXPLAIN (ANALYZE, COLUMNAR_ENGINE) בשאילתה.
דוגמה לתוכנית ביצוע של ScaNN (גרסת טרום-השקה (Preview))
הדוגמה הבאה היא של תוכנית הפעלה של שאילתה שמשתמשת באינדקס ScaNN שנוסף למנוע מבוסס-העמודות:
EXPLAIN (ANALYZE TRUE, SCANN TRUE, COSTS FALSE, TIMING FALSE, SUMMARY FALSE, VERBOSE FALSE, COLUMNAR_ENGINE TRUE)
SELECT * FROM t ORDER BY val <=> '[0.5,0.5,0.5,0.5]' LIMIT 100;
--This contains details about ScaNN's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Index Scan using scann_idx on t t_1 (actual rows=100 loops=1)
Order By: (val <=> '[0.5,0.5,0.5,0.5]'::vector)
Limit: 100
ScaNN Info: (... columnar engine nodes hit=6...)
Columnar Engine ScaNN Info: (index found=true)
(5 rows)
הנוכחות של columnar engine nodes hit ו-Columnar Engine ScaNN Info:
(index found=true) בפלט מאשרת שהמנוע מבוסס-העמודות משמש לשאילתה.
דוגמה לתוכנית הרצה של HNSW
בתוכנית הביצוע מוצג הקטע Columnar Engine HNSW Info של האינדקס הרלוונטי, שבו מופיעים מדדים כמו היחס בין הרכיבים שאוחזרו מהמנוע מבוסס-העמודות (elements_from_ce) לבין אלה שאוחזרו מהדיסק (elements_from_disk).
הדוגמה הבאה היא תוכנית ביצוע של שאילתה שמשתמשת באינדקס HNSW שנוסף למנוע מבוסס-העמודות:
EXPLAIN (ANALYZE, COLUMNAR_ENGINE) SELECT * FROM documents ORDER BY embedding <=> '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector LIMIT 5;
--This contains details about HNSW's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Limit (actual rows=5 loops=1)
-> Index Scan using hnsw_idx on documents (actual rows=5 loops=1)
Order By: (embedding '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector)
Columnar Engine HNSW Info: (index found=true elements_from_ce=385 elements_from_disk=0)
Columnar Check: table is not in the columnar store
(5 rows)
התגובה מראה שהאינדקס מואץ על ידי המנוע מבוסס-העמודות, כי כל הרכיבים אוחזרו מהמנוע מבוסס-העמודות (elements_from_ce=385) ואף אחד מהם לא אוחזר מהדיסק (elements_from_disk=0).
כששינויים בנתונים, כמו הצהרות INSERT, UPDATE או DELETE, מבטלים את התוקף של רשומות במטמון, המנוע מבוסס-העמודות משתמש בגישה היברידית כדי לשמור על הדיוק והביצועים. הוא קורא וקטורים תקינים שנשמרו במטמון ישירות מהזיכרון, ומאחזר רק את הווקטורים החדשים או ששונו מהדיסק.
אם משנים כמות גדולה של נתונים, יכול להיות שתראו עלייה זמנית ב-elements_from_disk וירידה בביצועים עד שהמטמון יתרענן.
ניהול האינדקס השמור במטמון
כדי לנהל את מחזור החיים של האינדקסים שנשמרו במטמון, פועלים לפי השלבים הבאים:
נכנסים לדף Clusters במסוף Google Cloud .
כדי להציג את הדף Overview של האשכול, לוחצים על שם האשכול של AlloyDB בעמודה Resource name.
בחלונית הניווט, לוחצים על AlloyDB Studio.
נכנסים ל-AlloyDB Studio באמצעות שם מסד הנתונים, שם המשתמש והסיסמה.
בכרטיסייה Editor 1, מזינים את פקודת ה-SQL של המשימה שבחרתם:
כדי לרענן את המטמון באופן ידני, מריצים את הפקודה הבאה:
SELECT google_columnar_engine_refresh_index('INDEX_NAME');כדי לבדוק את סטטוס האינדקס, מריצים את הפקודה הבאה:
SELECT google_columnar_engine_verify('INDEX_NAME');כדי להסיר את האינדקס מהמטמון, מריצים את הפקודה הבאה:
SELECT google_columnar_engine_drop_index('INDEX_NAME');כדי לראות את האינדקסים הפעילים, מריצים את הפקודה הבאה:
SELECT * FROM g_columnar_indexes;כדי להציג אינדקסים מחולקים למחיצות, מריצים את הפקודה הבאה:
SELECT * FROM g_columnar_index_partitions;
מחליפים את
INDEX_NAMEבשם של האינדקס.לוחצים על Run.
מגבלות
רענון של אינדקסי HNSW מואצים במנוע מבוסס-עמודות יכול לצרוך באופן זמני זיכרון עד פי שניים מגודל האינדקס.
המאמרים הבאים
- יצירת אינדקס HNSW
- יצירת אינדקס ScaNN
- מידע על המנוע מבוסס-העמודות של AlloyDB
- ניהול אינדקסים של ScaNN במנוע מבוסס-העמודות (תצוגה מקדימה)
- ביצוע חיפוש וקטורי