Version: latest

Vector Data Types

Table 1 Vector types
The DataVec vector engine supports the following vector data types.

NameDimension LimitDescription
vector[(d)]1–16,000A single-precision floating-point vector with an optional dimension d.
bit[(d)]1–83,886,080A bit vector with an optional dimension d.
sparsevec[(d)]1–1,000,000,000
Maximum number of non-zero elements: 16,000
A sparse vector with an optional dimension d.
halfvec[(d)]1–16,000A half-precision floating-point vector with an optional dimension d.

NOTE

The dimension limits above apply only to vector data storage and vector computation in TOAST tables. They do not include the dimension limits for non-TOAST tables (with the column storage mode set to plain) or vector indexes. See the table below for the specific dimension limits of non-TOAST tables, and see Vector Indexes for the dimension limits of vector indexes.

Storage space and dimension limits for non-TOAST tables:

NameStorage SpaceDimension Limit
vector[(d)](4 * dimension + 8) bytes1–2,028
bit[(d)](dimension / 8 + 8) bytes1–64,896
sparsevec[(d)](8 * number of non-zero elements + 16) bytes1–1,000,000,000
Maximum number of non-zero elements: 1,013
halfvec[(d)](2 * dimension + 8) bytes1–4,092

Vector

Each vector occupies 4 * dimension + 8 bytes of storage space.
Each element is a single-precision floating-point number, and all elements must be finite. That is, they cannot be NaN, Infinity, or -Infinity.
The maximum dimension of vector is 16,000.

Format

sql
['<ELEMENT>', ..., '<ELEMENT>']::vector
  • ELEMENT: element.

Example 1:

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

NOTE

The effective number of decimal digits of a single-precision floating-point number is approximately log10(224)7.225.

Bit

Each bit vector occupies dimension / 8 + 8 bytes of storage space.
The maximum dimension of bit is 83,886,080.

Format

sql
B'0/1, ...'

Example 2:

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

Sparsevec

Each sparsevec occupies 8 * number of non-zero elements + 16 bytes of storage space.
Each element is a single-precision floating-point number, and all elements must be finite. That is, they cannot be NaN, Infinity, or -Infinity.
The maximum number of non-zero elements in sparsevec is 16,000, and the maximum dimension is 1,000,000,000.

Format

sql
{INDEX:NON-ZERO, INDEX:NON-ZERO}/<DIMENSION>::sparsevec
  • INDEX: index of a non-zero element. The index must be less than the specified DIMENSION.
  • NON-ZERO: non-zero element.
  • DIMENSION: dimension.

Example 3:

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

Halfvec

Each halfvec occupies 2 * dimension + 8 bytes of storage space.
Each element is a half-precision floating-point number, and all elements must be finite. That is, they cannot be NaN, Infinity, or -Infinity.
The maximum dimension of halfvec is 16,000.

Format

sql
['<ELEMENT>', ..., '<ELEMENT>']::halfvec
  • ELEMENT: element.

Example 4:

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

Dimension Limits

When a vector data dimension is specified when creating a table, the dimension of inserted data must match the dimension specified for the table. If no dimension is specified, there is no dimension limit for vector, sparsevec, or halfvec data types, while the default dimension for bit is 1.

Example 5:

# Specify the dimension for 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

# Do not specify the dimension for 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
# Specify the dimension for 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

# Do not specify the dimension for 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 ('1010');
ERROR:  bit string length 4 does not match type bit(1)
CONTEXT:  referenced column: val
# Specify the dimension for 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

# Do not specify the dimension for 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
# Specify the dimension for halfvec
openGauss=# CREATE TABLE test1(val halfvec(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

# Do not specify the dimension for halfvec
openGauss=# CREATE TABLE test2(val halfvec);
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

Constraints

  • The vector, halfvec, and sparsevec data types are currently not supported for storage in column-store tables.
  • The vector, bit, sparsevec, and halfvec data types are currently not supported for storage in foreign tables.
  • Vector data storage is supported in ordinary row-store tables, temporary tables, TOAST tables, unlogged tables, segment-page tables, and other table types.