Vector Index 是 MaxCompute 提供的一種高效索引機制,用於加速大規模向量資料的相似性查詢。本文介紹Vector Index 的使用說明及樣本。
注意事項
建立VECTOR INDEX前請執行
SETPROJECT odps.schema.evolution.enable=true;命令,設定允許表結構變更(Schema Evolution)。目前只支援Delta Table概述建立Vector Index。
索引構建觸發時機說明
同步產生:主要在離線批處理情境,通過
CREATE VECTOR INDEX定義索引後,SQL Insert操作同步觸發索引產生。全量產生:當索引檢索不夠高效時,可以全量資料重建索引,可以通過
REBUILD INDEX命令觸發,或者後台智能檢測檢索效率自動觸發。
若待刪除的列被Vector Index引用,系統將阻止該列的刪除操作。需先刪除對應的索引後再執行刪除列操作。
對分區表重建 Vector Index 時,必須通過
PARTITION (...)明確指定分區範圍,否則會拋出語義分析異常。分區表可以刪除指定分區的index。
同一列僅允許建立一次索引,不支援重複建立。
同一張表中,多個向量列可分別建立不同名稱的索引。
產生 VECTOR INDEX
建立VECTOR INDEX
為向量列建立索引,加速檢索查詢。建立命令如下:
CREATE VECTOR INDEX <index_name>
ON <table_name> (<description_embedding>)
IDXPROPERTIES (
'algorithm' = 'xxx',
'distance_type' = 'xxx',
'build_params' = 'xxx'
...
);參數說明:
參數 | 描述 |
index_name | 指定的索引名稱。 |
table_name | 指定需要構建向量索引的表名稱。當前僅支援 Delta Table概述 類型的表 |
description_embedding | 指定表中包含向量資料的列名,用於構建向量索引。 |
algorithm | 指定向量索引使用的構建演算法。當前支援的演算法為 |
distance_type | 指定向量之間的相似性計算方式。支援以下類型:
|
build_params | 索引構建時的參數配置,以 JSON 格式傳入(如:'{"max_degree": 16, "ef_construction": 128}'),用於控制索引的構建品質和效能。常用參數包括:
Vector Index同時支援在索引內部對向量進行量化,量化相關參數如下:
關於量化配置相關實踐說明請參考VECTOR INDEX 開啟量化配置。 |
VECTOR INDEX 開啟量化配置
VECTOR INDEX 支援在索引內部對向量進行量化,以減少索引儲存和運行時記憶體,並降低檢索過程中的記憶體訪問開銷。量化只改變索引內部的向量編碼,不改變表中原始的VECTOR(FLOAT, dimension)資料,也不改變VECTOR_SEARCH的調用方式。MaxCompute VECTOR INDEX 支援以下兩種檢索方式:
單階段檢索:直接使用base_quantization_type完成圖遍曆和距離計算。索引結構簡單,記憶體佔用較低。
兩階段檢索:先使用低精度base向量快速召回候選,再使用precise向量重新計算距離,在檢索效能和召回率之間取得平衡。
常用量化參數組合如下:
配置 | 參數組合 | 參數配置說明 |
FP32 | base_quantization_type=fp32 | 特點:全精度基準,召回穩定,但記憶體佔用較高 適用情境:對精度要求較高或資料規模較小的情境 |
FP16 | base_quantization_type=fp16 | 特點:向量部分記憶體約為FP32的50%,召回基本一致 適用情境:對精度要求較高或資料規模較小的情境,相比FP32, 有一定的召回損失 |
SQ8 | base_quantization_type=sq8 | 特點:向量部分記憶體約為FP32的25%,可能產生少量召回損失 適用情境:記憶體敏感且允許一定召回損失的情境 |
SQ8+高精度重排 | sq8+fp16或fp32 reorder | 特點:使用SQ8進行圖遍曆,再通過高精度距離計算恢複召回 適用情境:需要兼顧檢索效率和召回率的情境 |
RaBitQ+高精度重排 | rabitq+fp16或fp32 reorder | 特點:使用更緊湊的編碼進行圖遍曆,候選結果使用高精度向量重排 適用情境:索引重建較頻繁且要求高召回的情境 |
量化主要帶來以下收益:
減少索引檔案大小和運行時記憶體佔用。
降低索引載入和檢索過程中的記憶體頻寬開銷。
提升CPU Cache利用率,使單個Worker能夠載入和處理更多向量。
通過base量化和高精度reorder組合,在檢索效能、資源成本和召回率之間靈活取捨。
推薦使用FP16建立HGraph索引,更多量化配置樣本請參考樣本:建立Vector Index,使用FP16量化、樣本:建立Vector Index,使用RaBitQ低精度圖遍曆和高精度重排。
彙總VECTOR INDEX
INSERT OVERWRITE TABLE <table_name> [PARTITION <partition_spec>]
SELECT ......重建VECTOR INDEX
使用如下命令對存量資料重建VECTOR INDEX。
非分區表重建。
ALTER TABLE <table_name> REBUILD INDEX <index_name> ;分區表重建。 支援一次同時對多個分區的VECTOR INDEX進行REBUILD操作。
ALTER TABLE <table_name> PARTITION
(<partition_name1=value1>[, partition_name2=value2, ...]) REBUILD INDEX <index_name> ;
ALTER TABLE <table_name> PARTITION(partition_name >=value) REBUILD INDEX <index_name> ;列出表的VECTOR INDEX
SHOW INDEXES ON <table_name>;查看VECTOR INDEX的資訊
DESC INDEX index_name ON <table_name> [PARTITION <partition_spec>];刪除VECTOR INDEX
DROP INDEX [IF EXISTS] index_name ON <table_name> [PARTITION <partition_spec>];使用樣本
資料準備
SET odps.sql.type.system.odps2=true;
SET odps.sql.type.vector.enable=true;
DROP TABLE IF EXISTS vector_test;
DROP VIEW IF EXISTS vector_test;
CREATE TABLE IF NOT EXISTS vector_test(
c0 int,
c1 vector(float, 2),
c2 vector(float, 3)
) STORED AS aliorc
TBLPROPERTIES (
'table.format.version'='2',
'acid.data.retain.hours'='24',
'columnar.nested.type'='true',
'transactional'='true'
);
INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F) UNION ALL
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F)
UNION ALL
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F);樣本:建立VECTOR INDEX,並插入資料
CREATE VECTOR INDEX c2_vector_index
ON vector_test (c2)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'cosine',
'build_params' = '{"max_degree": 16, "ef_construction": 128}');
ALTER TABLE vector_test REBUILD INDEX c2_vector_index;
INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F)
UNION ALL
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F)
UNION ALL
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F)
UNION ALL
SELECT 4, vector(4.4F,5.5F), vector(4.4F,5.5F,6.6F)
UNION ALL
SELECT 5, vector(5.5F,6.6F), vector(5.5F,6.6F,7.7F);
樣本:VECTOR INDEX重建
ALTER TABLE vector_test REBUILD INDEX c2_vector_index;
SELECT * FROM vector_test;
-- 返回結果
+------+------+------+
| c0 | c1 | c2 |
+------+------+------+
| 1 | [1.1, 2.2] | [1.1, 2.2, 3.3] |
| 2 | [2.2, 3.3] | [2.2, 3.3, 4.4] |
| 3 | [3.3, 4.4] | [3.3, 4.4, 5.5] |
| 4 | [4.4, 5.5] | [4.4, 5.5, 6.6] |
| 5 | [5.5, 6.6] | [5.5, 6.6, 7.7] |
+------+------+------+
樣本:列出表的VECTOR INDEX
SHOW INDEXES ON vector_test;
-- 返回結果
{"Indexes": [{
"createTime": 1779900024105,
"id": "512d520**45e1c7ba8",
"indexColumns": [{"name": "c2"}],
"name": "c2_vector_index",
"properties": {
"algorithm": "hgraph",
"build_params": "{\"max_degree\": 16, \"ef_construction\": 128}",
"distance_type": "cosine"},
"type": "VECTOR"}]}樣本:查看VECTOR INDEX的資訊
DESC INDEX c2_vector_index ON vector_test;
-- 返回結果
+------------------------------------------------------------------------------------+
| Index Detail |
+------------------------------------------------------------------------------------+
| name: c2_vector_index |
| id: 512d520**e1c7ba8 |
| index_type: VECTOR |
| index_columns: c2 |
| status: ACTIVE |
| coverage_percentage: 100% |
| storage_size_bytes: 6940 |
| properties: build_params={"max_degree": 16, "ef_construction": 128}, distance_type=cosine, algorithm=hgraph |
+------------------------------------------------------------------------------------+
樣本:刪除VECTOR INDEX
DROP INDEX c2_vector_index ON vector_test;
-- 返回結果
{"Indexes": []}樣本:建立Vector Index,使用FP16量化
CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'dot_product',
'build_params' = '{
"max_degree":48,
"ef_construction":400,
"base_quantization_type":"fp16"
}'
);
-- 建立索引後,需要對存量資料執行索引重建
ALTER TABLE doc_table PARTITION (pt='20260730') REBUILD INDEX doc_vector_index;樣本:建立Vector Index,使用RaBitQ低精度圖遍曆和高精度重排
CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'dot_product',
'build_params' ='{
"max_degree":48,
"ef_construction":400,
"base_quantization_type":"rabitq",
"use_reorder":true,
"precise_quantization_type":"fp32"
}'
);