האצת חיפוש וקטורים באמצעות מנוע מבוסס-עמודות

בחירת גרסת המסמך:

אתם יכולים להשתמש במנוע מבוסס-העמודות של AlloyDB Omni כדי להאיץ את החיפושים של וקטורים כשאתם משתמשים באינדקס Scalable Nearest Neighbors ‏ (ScaNN) או באינדקס Hierarchical Navigable Small World ‏ (HNSW). המנוע מבוסס-העמודות פועל כמטמון בזיכרון שעבר אופטימיזציה לקריאה של אינדקסי הווקטורים האלה.

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

אפשר להשתמש ב-HNSW רק עם מנוע מבוסס-עמודות באשכולות AlloyDB Omni שמופעלים באמצעות PostgreSQL 17 ואילך. ב-ScaNN עם מנוע עמודות אין מגבלה כזו.

לפני שמתחילים

  • מגדירים את הדגלים לניהול מסד הנתונים google_columnar_engine.enabled ו-google_columnar_engine.enable_index_caching לערך on כדי להפעיל את המנוע מבוסס-העמודות ואת התכונה שלו לשמירת מטמון לאינדקס.

    כדי להגדיר את הדגלים לניהול מסד הנתונים, מריצים את הפקודה ALTER SYSTEM ב-PostgreSQL:

    ALTER SYSTEM SET google_columnar_engine.enabled = 'on';
    ALTER SYSTEM SET google_columnar_engine.enable_index_caching = 'on';
    

    כדי שהשינויים ייכנסו לתוקף, טוענים מחדש את ההגדרות של מנהל systemd ומפעילים מחדש את השירות alloydbomni:

    sudo systemctl restart alloydbomni18

    למידע נוסף על הגדרת דגלים, ראו הגדרת דגלים של מסדי נתונים.

  • יוצרים אינדקס ScaNN או יוצרים אינדקס HNSW במסד הנתונים.

הוספת אינדקס למנוע מבוסס-עמודות

אחרי שמפעילים את מנוע מבוסס-העמודות, אפשר להוסיף אינדקס קיים למטמון באמצעות פונקציית ה-SQL‏ google_columnar_engine_add_index().

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

SELECT google_columnar_engine_add_index('INDEX_NAME');

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

אחרי שמוסיפים אינדקס למנוע מבוסס-העמודות, כל השאילתות שמשתמשות באינדקס הזה מואצות באופן אוטומטי על ידי המנוע מבוסס-העמודות. כדי לוודא שהמנוע מבוסס-העמודות מאיץ את השאילתות הווקטוריות, אתם יכולים להשתמש בתוכנית EXPLAIN (ANALYZE, COLUMNAR_ENGINE) בשאילתה.

אימות השימוש במטמון

כדי לוודא שהשאילתות הווקטוריות מואצות על ידי מנוע מבוסס-עמודות, אפשר להשתמש בEXPLAIN (ANALYZE, COLUMNAR_ENGINE) plan בשאילתה.

תוכנית הרצה לדוגמה של ScaNN

הדוגמה הבאה היא של תוכנית ביצוע לשאילתה שמשתמשת באינדקס 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 וירידה בביצועים עד שהמטמון יתרענן.

ניהול האינדקס שנשמר במטמון

כדי לנהל את מחזור החיים של האינדקסים שנשמרו במטמון, מריצים את פקודת ה-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 בשם של האינדקס.

מגבלות

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

המאמרים הבאים