向量数据类型

表 1 向量类型 DataVec向量引擎所支持的向量数据类型。

名称维度限制描述
vector[(d)]1~16,000单精度浮点数向量,可指定维度d
bit[(d)]1~83,886,080位向量,可指定维度d
sparsevec[(d)]1~1,000,000,000
最大非零元素数:16,000
稀疏向量,可指定维度d

说明: 上述维度限制只限于Toast表的向量数据存储以及向量计算,并不包含非TOAST表(设置列储存模式为plain)和向量索引的维度限制,具体维度信息请参考向量索引

非Toast表存储空间及维度限制:

名称存储空间维度限制
vector[(d)](4 * 维度 + 8)字节1~2,028
bit[(d)](维度 / 8 + 8)字节1~64,896
sparsevec[(d)](8 * 非零元素数 + 16)字节1~1,000,000,000
最大非零元素数:1,013

Vector

每个vector占用 4 * 维度 + 8 字节的储存空间。 每个元素都是单精度浮点数,并且所有的元素都是有限的:(不能为 NaNInfinity 或者 -Infinity)。 vector的最大维度为 16,000

格式

['<ELEMENT>', ..., '<ELEMENT>']::vector
  • ELEMENT - 元素

示例1:

openGauss=# SELECT '[1,2,3]'::vector;
 vector  
---------
 [1,2,3]
(1 row)

说明: 单精度浮点数的有效小数位约为 $\log_{10}(2^{24}) \approx 7.225$

Bit

每个bit向量占用维度 / 8 + 8字节的存储空间。 bit的最大维度为83,886,080

格式

B'0/1, ...'

示例2:

openGauss=# SELECT B'110';
 ?column? 
----------
 110
(1 row)

Sparsevec

每个sparse向量占用8 * 非零元素数 + 16字节的存储空间。 每个元素都是单精度浮点数,并且所有的元素都是有限的: (不能为 NaNInfinity 或者 -Infinity)。 Sparse的最大非零元素数为16,000,最大维度为1,000,000,000

格式

{INDEX:NON-ZERO, INDEX:NON-ZERO}/<DIMENSION>::sparsevec
  • INDEX - 非零元素下标,需小于指定维度DIMENSION
  • NON-ZERO - 非零元素
  • DIMENSION - 维度

示例3:

openGauss=# SELECT '{1:1.5,3:3.5}/5'::sparsevec;
    sparsevec    
-----------------
 {1:1.5,3:3.5}/5
(1 row)

维度限制

建表时若指定向量数据维度,插入数据必须等于表中的维度;如果不指定维度,则对vector、sparsevec类型的向量数据没有限制,bit默认维度为1。

示例4:

# vector指定维度
openGauss=# CREATE TABLE test1(val vector(3));
CREATE TABLE
openGauss=# INSERT INTO test1 (val) VALUES ('[1,2,3]');
INSERT 0 1
openGauss=# INSERT INTO test1 (val) VALUES ('[1,2,3,4]');
ERROR:  expected 3 dimensions, not 4
CONTEXT:  referenced column: val

# vector不指定维度
openGauss=# CREATE TABLE test2(val vector);
CREATE TABLE
openGauss=# INSERT INTO test2 (val) VALUES ('[1,2,3]');
INSERT 0 1
openGauss=# INSERT INTO test2 (val) VALUES ('[1,2,3,4]');
INSERT 0 1
# bit指定维度
openGauss=# CREATE TABLE test1(val bit(3));
CREATE TABLE
openGauss=# INSERT INTO test1 (val) VALUES ('101');
INSERT 0 1
openGauss=# INSERT INTO test1 (val) VALUES ('1010');
ERROR:  bit string length 4 does not match type bit(3)
CONTEXT:  referenced column: val

# bit不指定维度
openGauss=# CREATE TABLE test2(val bit);
CREATE TABLE
openGauss=# INSERT INTO test2 (val) VALUES ('1');
INSERT 0 1
openGauss=# INSERT INTO test2 (val) VALUES ('101');
ERROR:  bit string length 4 does not match type bit(1)
CONTEXT:  referenced column: val
# sparsevec指定维度
openGauss=# CREATE TABLE test1(val sparsevec(3));
CREATE TABLE
openGauss=# INSERT INTO test1 (val) VALUES ('{1:1,2:1,3:1}/3');
INSERT 0 1
openGauss=# INSERT INTO test1 (val) VALUES ('{1:1,2:1,3:1,4:1}/4');
ERROR:  expected 3 dimensions, not 4
CONTEXT:  referenced column: val

# sparsevec不指定维度
openGauss=# CREATE TABLE test2(val sparsevec);
CREATE TABLE
openGauss=# INSERT INTO test2 (val) VALUES ('{1:1,2:1,3:1}/3');
INSERT 0 1
openGauss=# INSERT INTO test2 (val) VALUES ('{1:1,2:1,3:1,4:1}/4');
INSERT 0 1

约束

  • vector和sparsevec数据类型暂不支持列存表存储
  • vector,bit和sparsevec暂不支持外表存储
  • 支持普通行存表,临时表,Toast表,Unlogged,段页式表等的向量数据存储
意见反馈
编组 3备份
    openGauss 2025-04-24 09:27:24
    取消