全部產品
Search
文件中心

MaxCompute:VECTOR INDEX

更新時間:Aug 15, 2026

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

指定向量索引使用的構建演算法。當前支援的演算法為 hgraph

distance_type

指定向量之間的相似性計算方式。支援以下類型:

  • cosine:餘弦相似性,用于衡量兩個向量方向的相似性(常用於文本、映像特徵向量等情境)。

  • euclidean:歐幾裡得距離,表示兩個向量在空間中的直線距離。

  • dot_product:點積(內積),適用於已歸一化的向量,值越大表示相似性越高。

build_params

索引構建時的參數配置,以 JSON 格式傳入(如:'{"max_degree": 16, "ef_construction": 128}'),用於控制索引的構建品質和效能。常用參數包括:

  • max_degree:控製圖中每個節點的最大串連數,值越大索引精度越高,但構建和查詢耗時可能增加。

  • ef_construction:構建階段的候選列表大小,影響索引的構建效率與搜尋品質,值越大構建時間越長,但可能提升搜尋精度。

Vector Index同時支援在索引內部對向量進行量化,量化相關參數如下:

  • base_quantization_type:圖遍曆和候選召回階段使用的向量編碼。取值包括fp32、fp16、sq8、sq8_uniform和rabitq。

  • use_reorder:是否對圖遍曆召回的候選集進行高精度重排,預設為false。開啟reorder後,索引需要同時儲存base和precise兩份向量編碼。因此,base量化率較高並不一定代表最終索引更小。實際索引大小還與precise類型、向量維度和HGraph圖結構有關。

  • precise_quantization_type:重排階段使用的向量精度,僅在use_reorder=true時生效,常用取值為fp16或fp32。

關於量化配置相關實踐說明請參考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"
  }'
);