使用限制
前提条件
不支持在 USTORE、CSTORE 存储引擎中使用向量检索。
向量字段和向量索引维度限制
- 不允许建立超过 16384 个维度的向量字段。
- Graph_Index、DiskANN、HybridANN 索引支持在不超过 16384 维度的字段上建立。
- 其他向量索引仅支持在不超过 2000 维度的字段上建立。
不支持的向量运算符
暂不支持的运算符 | 含义 | 影响 |
---|---|---|
|| | 将两个向量连接成一个新的更长的向量。 | 尝试使用此运算符时将导致错误。 |
* | 两个向量逐元素相乘。 | 尝试使用此运算符时将导致错误。 |
<+> | 计算两个向量之间的曼哈顿距离,即各维度差的绝对值之和。 | 尝试使用此运算符时将导致错误。 |
不支持的向量比较符
暂不支持的比较符 | 含义 | 影响 |
---|---|---|
= | 用于判断两个向量的所有对应元素是否完全相等。 | 尝试使用此比较符将导致报错。 |
> | 用于判断一个向量是否大于另一个向量。 | 尝试使用此比较符将导致报错。 |
< | 用于判断一个向量是否小于另一个向量。 | 尝试使用此比较符将导致报错。 |
>= | 用于判断一个向量是否大于等于另一个向量。 | 尝试使用此比较符将导致报错。 |
<= | 用于判断一个向量是否小于等于另一个向量。 | 尝试使用此比较符将导致报错。 |
<> | 用于判断两个向量是否不同。 | 尝试使用此比较符将导致报错。 |
!= | 用于判断两个向量是否不同。 | 尝试使用此比较符将导致报错。 |
BETWEEN | 判断向量是否在指定范围内。 | 尝试使用此比较符将导致报错。 |
不支持的聚合函数
除count()之外, 向量字段不支持其他聚合函数。
以下用法报错:
create table test1(c1 int,c2 floatvector(3));
select avg(c2) from test1;
select sum(c2) from test1;
向量字段不支持 union 和 col in(...) 语法
向量数据暂不支持 =
操作符,故暂不支持上述用法。
向量字段不能用在 GROUP BY/ORDER BY 子句中
create table test1(c1 int,c2 floatvector(3));
--以下 SELECT 语句报错:
select c2 from test group by c2 limit 3;
select c2 from test order by c2;
向量字段不能作为主键或唯一性约束
以下用法报错:
create table test1(c1 int unique,c2 floatvector primary key);
create table test1(c1 int,c2 floatvector unique);
建立索引删除/更新大量数据后应先 VACUUM 重建索引
原因
当删除或者更新数据后,改动之前的数据并不会立即从存储中移除,而是作为“死元组”存在于表中。索引仍然可能指向这些死元组,导致查询统计结果时时误将这些无效数据包含在内,虽然返回客户端之前会过滤掉,用户不会直接看到已经删除的数据,但是当候补元组数量不足时,可能造成返回数据少于预期。
HNSW 索引由参数 hnsw_ef_search 决定候补元组数,hnsw_ef_search 越大候补元组数越多;ivfflat 及 ivf-pq 索引由参数 ivf_nlist 和 ivf_probes 决定候补元组数,ivf_nlist 越小、ivf_probes 越大,候补元组数越多。
建议
当更新/删除数据占总元组数达到 60% 或更高,删除索引,再 VACUUM,重建索引。