---
title: "基于内存的稀疏向量索引 - OceanBase Database AI V4.6.2 | OceanBase 文档中心"
description: 基于内存的稀疏向量索引 本文档介绍 OceanBase Database AI 中的基于内存的稀疏向量索引的创建、搜索和使用方法。简称内存稀疏索引。支持 SINDI 和 SINDI_SQ 两种索引类型。 注意 该功能为实验特性，不建议在生产环境使用。 概述 内存稀疏索引是 OceanBase Database AI …
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*inJjSpyNOjUAAAAAHtAAAAgAeiGDAQ/original) OceanBase Database AIV 4.6.2

# 基于内存的稀疏向量索引

更新时间：2026-08-14 11:48:11

[编辑](https://github.com/oceanbase/oceanbase-database-ai/edit/V4.6.2/zh-CN/400.ai-search/300.vector-search/200.vector-index/400.sparse-vector-index/100.in-memory-sparse-vector-index.md)  

本文档介绍 OceanBase Database AI 中的基于内存的稀疏向量索引的创建、搜索和使用方法。简称内存稀疏索引。支持 SINDI 和 SINDI_SQ 两种索引类型。

#### 注意

该功能为实验特性，不建议在生产环境使用。

## 概述

内存稀疏索引是 OceanBase Database AI 针对稀疏向量数据（大部分元素为零的向量）提供的高效索引类型，需要将索引完整的载入内存，支持 DML 和实时搜索。为了提升稀疏向量的查询性能，OceanBase Database AI 集成了 VSAG 算法库的稀疏向量索引（SINDI），该索引在性能上优于基于磁盘的稀疏向量索引，适合在内存资源充足的情况下使用。

## 功能支持

基于内存的稀疏向量索引支持以下功能：

| 模块 | 功能点 | 介绍 |
| --- | --- | --- |
| DDL | 建表时创建稀疏向量索引 | 可以在创建表的时候，在 `SPARSEVECTOR` 列上创建稀疏向量索引。最大支持 500,000 维。 |
| DDL | 后建稀疏向量索引 | 支持在已存在表的 `SPARSEVECTOR` 列上创建稀疏向量索引。最大支持 500,000 维。 |
| DML | 插入、更新、删除 | 与常规向量索引的 DML 操作语法完全一致。 |
| 搜索 | 向量搜索 | 支持使用 SQL 函数进行搜索。 |
| 搜索 | 查询参数 | 支持在搜索时通过 `parameters` 子句设置查询级参数。 |
| DBMS_VECTOR | `REBUILD_INDEX` | 执行索引全量重建。 |
| 监控 | 索引监控 | 支持通过视图查看索引的基本信息和实时状态，具体请参见 [索引监控与维护](https://www.oceanbase.com/docs/common-oceanbase-database-ai-1000000006779270)。 |

## 索引内存估算与实际占用查询

支持通过 `DBMS_VECTOR` 系统包进行索引内存估算，用法与稠密索引一致，这里仅介绍稀疏向量索引的特殊要求：

- `IDX_TYPE` 参数须指定为 `SINDI` 或 `SINDI_SQ`，大小写不敏感。
 - 稀疏向量的内存估算依赖稀疏向量的平均长度，即每条向量中非零维度数量的平均值。

## 创建语法及说明

基于内存的稀疏向量索引支持**建表时创建**和**后建**两种方式。创建时需要注意：

- 维度上限：创建稀疏向量索引的列最大支持 500,000 维。
 - 列类型：创建稀疏向量索引必须指定在 `SPARSEVECTOR` 类型的列上。
 - 关键字：创建索引必须带有 `VECTOR` 关键字。
 - 索引类型：支持 `sindi` 和 `sindi_sq`：`sindi` 表示全精度内存稀疏索引，`sindi_sq` 表示标量量化稀疏索引。SINDI_SQ 需在一定规模数据上建索引以降低精度损失，逻辑与 HNSW_SQ 一致。
 - 距离算法：仅支持 `inner_product`（内积）。
 - 参数一致：后建索引的参数和说明与建表时创建索引一致。
 - SINDI_SQ 索引建议在写入数据后再创建索引，并在写入较多增量数据后进行索引重建：
     - 如果是随表创建，则先建 SINDI，数据超过 1 万条后可重建为 SINDI_SQ。
     - 如果是后建，则单分区数据不超过 1 万条创建 SINDI，超过 1 万条可直接创建 SINDI_SQ。

### 建表时创建

支持使用 `CREATE TABLE` 语句创建稀疏向量索引。

#### 语法

```sql
CREATE TABLE table_name (
    column_name1 data_type1,
    column_name2 SPARSEVECTOR,
    ...,
    VECTOR INDEX index_name (column_name2) WITH (param1=value1, param2=value2, ...)
);

```

#### 参数说明

| 参数 | 默认值 | 取值范围 | 是否必填 | 说明 | 备注 |
| --- | --- | --- | --- | --- | --- |
| `distance` |  | `inner_product` | 是 | 指定向量距离算法类型。 | SINDI 和 SINDI_SQ 索引均仅支持内积（`inner_product`）作为距离算法。 |
| `type` |  | `sindi` / `sindi_sq` | 是 | 指定索引算法类型。 | `sindi` 表示全精度内存稀疏索引，`sindi_sq` 表示标量量化稀疏索引。 |
| `lib` | `vsag` | `vsag` | 否 | 指定向量索引库类型。 | 目前仅支持 VSAG 向量库。 |
| `prune` | `false` | `true`/`false` | 否 | 是否对向量执行剪枝。 | `prune` 为 `true` 时，才需要设置 `refine` 和 `drop_ratio_build` 参数；`prune` 为 `false` 时，可以提供全精度的搜索，如果设置 `refine` 为 `true` 或者 `drop_ratio_build` 非 `0` 会报错。 |
| `refine` | `false` | `true`/`false` | 否 | 是否需要重排。 | 取值为 `true` 时，会对搜索结果获取原始稀疏向量来进行高精度的距离计算并重排，意味着需要多存储一份原始向量数据。仅在 `prune=true` 时可设置。 |
| `drop_ratio_build` | `0` | `[0, 0.9]` | 否 | 对稀疏向量数据进行剪枝的比例。 | 新插入一条稀疏向量，会按照值大小裁剪掉 `query_length * drop_ratio_build` 个最小的值。如果 `refine` 为 `true`，则会保持原始向量数据，否则只保留裁剪后的数据。仅在 `prune=true` 时可设置。 |
| `drop_ratio_search` | `0` | `[0, 0.9]` | 否 | 对搜索稀疏向量数值进行剪枝的比例。 | 取值越大，剪枝越多，准确率越低，性能越高。也可以在搜索时通过 `parameters` 子句设置，查询参数优先级更高。 |
| `refine_k` | `4.0` | `[1.0, 1000.0]` | 否 | 表示参与重排的比例。 | 搜索 `limit_k * refine_k` 项结果，并获取原始向量进行重排。`refine=true` 的情况下才有意义。也可以在搜索时通过 `parameters` 子句设置，查询参数优先级更高。 |

### 后建索引

支持在已经存在表的 `SPARSEVECTOR` 列上创建稀疏向量索引。

#### 语法

```sql
CREATE VECTOR INDEX index_name ON table_name(column_name) WITH (param1=value1, param2=value2, ...);

```

#### 参数说明

参数说明与建表时创建索引一致，详见上文。

## 创建、更新与删除示例

### 建表时创建

创建测试表 `sparse_t1` 并创建稀疏向量索引：

```sql
CREATE TABLE sparse_t1 (
    c1 INT PRIMARY KEY,
    c2 SPARSEVECTOR,
    VECTOR INDEX sparse_idx1(c2)
    WITH (lib=vsag, type=sindi, distance=inner_product)
);

```

创建测试表 `sparse_t1_sq` 并创建 SINDI_SQ 索引：

```sql
CREATE TABLE sparse_t1_sq (
    c1 INT PRIMARY KEY,
    c2 SPARSEVECTOR,
    VECTOR INDEX sparse_idx1_sq(c2)
    WITH (lib=vsag, type=sindi_sq, distance=inner_product)
);

```

向测试表插入稀疏向量数据：

```sql
INSERT INTO sparse_t1 VALUES(1, '{1:0.1, 2:0.2, 3:0.3}');
INSERT INTO sparse_t1 VALUES(2, '{3:0.3, 2:0.2, 4:0.4}');
INSERT INTO sparse_t1 VALUES(3, '{3:0.3, 4:0.4, 5:0.5}');

```

搜索测试表：

```sql
SELECT * FROM sparse_t1;

```

返回结果如下：

```
+----+---------------------+
| c1 | c2                  |
+----+---------------------+
|  1 | {1:0.1,2:0.2,3:0.3} |
|  2 | {2:0.2,3:0.3,4:0.4} |
|  3 | {3:0.3,4:0.4,5:0.5} |
+----+---------------------+
3 rows in set

```

### 后建索引

创建测试表后再创建稀疏向量索引：

```sql
CREATE TABLE sparse_t2 (
    c1 INT PRIMARY KEY,
    c2 SPARSEVECTOR
);

CREATE VECTOR INDEX sparse_idx2 ON sparse_t2(c2)
WITH (lib=vsag, type=sindi, distance=inner_product,
      prune=true, refine=true, drop_ratio_build=0.1,
      drop_ratio_search=0.5, refine_k=2.0);

```

```sql
INSERT INTO sparse_t2 VALUES(1, '{1:0.1, 2:0.2, 3:0.3}');

```

搜索测试表：

```sql
SELECT * FROM sparse_t2;

```

返回结果如下：

```shell
+----+---------------------+
| c1 | c2                  |
+----+---------------------+
|  1 | {1:0.1,2:0.2,3:0.3} |
+----+---------------------+
1 row in set

```

### 更新

更新稀疏向量数据时，索引会自动维护：

```sql
UPDATE sparse_t1 SET c2 = '{1:0.1}' WHERE c1 = 1;

```

### 删除

删除操作与常规向量索引一致，直接删除数据即可：

```sql
DELETE FROM sparse_t1 WHERE c1 = 1;

```

## 搜索

稀疏向量索引的搜索语法与稠密向量索引类似，使用 `APPROXIMATE`/`APPROX` 关键字进行近似最近邻搜索。

### 语法

```sql
SELECT ... FROM table_name
ORDER BY inner_product(column_name, query_vector) [APPROXIMATE|APPROX]
LIMIT n [PARAMETERS(param1=value1, param2=value2)];

```

其中：

- `column_name`：稀疏向量索引创建时指定的 `SPARSEVECTOR` 列。
 - `query_vector`：查询向量，可以是稀疏向量格式的字符串，如 `'{1:2.4, 3:1.5}'`。
 - `n`：返回的结果行数。
 - `PARAMETERS`：可选的查询级参数，用于设置 `drop_ratio_search` 和 `refine_k`。

### 搜索语法要求

- 必须指定 `APPROXIMATE/APPROX` 关键字，搜索才会使用向量索引而非全表扫描。
 - 必须包含 `ORDER BY` 和 `LIMIT` 子句。
 - `ORDER BY` 只支持单个向量条件。
 - `LIMIT + OFFSET` 的取值范围为 `(0, 16384]`。
 - 不指定 `LIMIT` 子句会报错。

### 距离函数使用规则

- 指定 `APPROXIMATE/APPROX`，调用支持的距离函数，且与向量索引算法匹配，搜索会使用向量索引。
 - 指定 `APPROXIMATE/APPROX`，距离函数与向量索引算法不匹配，搜索不会使用向量索引，但也不会报错。
 - 指定 `APPROXIMATE/APPROX`，如果距离函数为不支持的距离函数，搜索不会使用向量索引，且会报错。
 - 未指定 `APPROXIMATE/APPROX`，调用支持的距离函数，搜索不会使用向量索引，但也不会报错。

### 其他说明

- `WHERE` 条件会作为向量索引搜索的过滤条件。
 - 召回率受构建参数和搜索参数的影响。
 - 索引搜索参数可以在创建索引时进行设置。如果在索引创建完成后需要调整，可以通过 [DBMS_VECTOR.REBUILD_INDEX](https://www.oceanbase.com/docs/common-oceanbase-database-ai-1000000006780809) 修改表级属性，也可以在查询时通过指定查询级别参数 `ef_search` 进行调整。

### 搜索特有要求

详细要求请参见[稠密向量索引](https://www.oceanbase.com/docs/common-oceanbase-database-ai-1000000006779569)。这里仅介绍稀疏向量索引的特殊要求：

- 查询参数的优先级：`PARAMETERS` 设置的查询级参数 > 构建索引设置的查询参数 > 默认值。
 - `drop_ratio_search`：取值 `[0, 0.9]`，默认值 `0`。对查询稀疏向量数值进行剪枝的比例，取值越大，剪枝越多，准确率越低，性能越高。按照值大小剪枝掉 `query_length * drop_ratio_search` 个最小的值。由于全部裁剪掉没有意义，因此最少都会保留一个值。
 - `refine_k`：取值 `[1.0, 1000.0]`，默认值为 `4.0`。表示参与重排的比例，查询 `limit_k * refine_k` 项结果，并获取原始向量进行重排。仅在 `refine=true` 时有效。

### 使用示例

#### 普通查询

```sql
CREATE TABLE t1 (
    c1 INT PRIMARY KEY,
    c2 SPARSEVECTOR,
    VECTOR INDEX idx1(c2)
    WITH (lib=vsag, type=sindi, distance=inner_product)
);

INSERT INTO t1 VALUES(1, '{1:0.1, 2:0.2, 3:0.3}');
INSERT INTO t1 VALUES(2, '{3:0.3, 2:0.2, 4:0.4}');
INSERT INTO t1 VALUES(3, '{3:0.3, 4:0.4, 5:0.5}');
INSERT INTO t1 VALUES(4, '{5:0.5, 4:0.4, 6:0.6}');
INSERT INTO t1 VALUES(5, '{5:0.5, 6:0.6, 7:0.7}');

SELECT * FROM t1
ORDER BY negative_inner_product(c2, '{3:0.3, 4:0.4}')
APPROXIMATE LIMIT 4;

```

返回结果如下：

```shell
+----+---------------------+
| c1 | c2                  |
+----+---------------------+
|  2 | {2:0.2,3:0.3,4:0.4} |
|  3 | {3:0.3,4:0.4,5:0.5} |
|  4 | {4:0.4,5:0.5,6:0.6} |
|  1 | {1:0.1,2:0.2,3:0.3} |
+----+---------------------+

```

#### 使用查询参数

```sql
SELECT *, negative_inner_product(c2, '{3:0.3, 4:0.4}')  
AS score  FROM t1  
ORDER BY score APPROXIMATE LIMIT 4  
PARAMETERS(drop_ratio_search=0.5);

```

返回结果如下：

```shell
+----+---------------------+---------------------+
| c1 | c2                  | score               |
+----+---------------------+---------------------+
|  4 | {4:0.4,5:0.5,6:0.6} | -0.1600000113248825 |
|  3 | {3:0.3,4:0.4,5:0.5} | -0.2500000149011612 |
|  2 | {2:0.2,3:0.3,4:0.4} | -0.2500000149011612 |
+----+---------------------+---------------------+
3 rows in set

```

## 索引监控与维护

基于内存的稀疏向量索引提供了一些监控视图，且支持使用 `DBMS_VECTOR` 系统包进行索引维护，包括增量刷新和全量重建。用法与稠密索引一致。

## 相关文档

- 关于稀疏向量数据类型的详细信息，请参见[向量数据类型](https://www.oceanbase.com/docs/common-oceanbase-database-ai-1000000006779117)。
 - 关于向量距离函数的详细信息，请参见[向量函数](https://www.oceanbase.com/docs/common-oceanbase-database-ai-1000000006779121)。
 - 关于稠密向量索引的监控与维护，请参见[索引监控与维护](https://www.oceanbase.com/docs/common-oceanbase-database-ai-1000000006779270)。
 - 关于向量索引的内存估算与实际占用查询，请参见[向量索引内存管理](https://www.oceanbase.com/docs/common-oceanbase-database-ai-1000000006779273)。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
