文章目录
- Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作
- VECTOR 数据类型基本语法
- Vector 维度限制和向量大小
- 向量存储格式(DENSE vs SPARSE)
- 1. DENSE存储
- 2. SPARSE存储
- 3. 内部存储与空间计算
- Oracle VECTOR数据类型的声明格式
- VECTOR基本操作
- 创建包括VECTOR类型的表
- 插入数据
- 查询数据
- VECTOR相关函数
- 1. 向量创建函数
- VECTOR() 与 TO_VECTOR()
- 2. 向量属性相关函数
- VECTOR_NORM()
- VECTOR_DIMENSION_COUNT()
- VECTOR_DIMENSION_FORMAT()
- 3. 向量转换函数
- VECTOR_SERIALIZE()与 FROM_VECTOR()
- 4. 相似性计算函数
- VECTOR_DISTANCE()
- 5. 向量数据的分块管理
- 6.生成向量嵌入
- 参考
Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作
Oracle Database 23ai 引入了 VECTOR 数据类型,用于存储高维数值向量(如文本、图像、音视频的嵌入向量)。
VECTOR 数据类型基本语法
创建Oracle VECTOR 数据类型列的基本语法如下:
VECTOR([dimensions], [format], [storage_type])
其中各个参数如下:
dimensions(可选):指定固定维度数(1-65535),*表示允许任意维度。
format(可选):INT8、FLOAT32、FLOAT64、BINARY,*表示允许任意格式。
storage_type(可选):DENSE(默认)或SPARSE。
例:
SQL> CREATE TABLE my_vectors (id NUMBER, embedding VECTOR);
Table created.
SQL> CREATE TABLE my_vectors2 (id NUMBER, embedding VECTOR(768, INT8)) ;
Table created.
SQL>
参考:
SQL Language Reference
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector.html
VECTOR
VECTOR ( expr [ , number_of_dimensions [ , format ] ] )
Create Tables Using the VECTOR Data Type
https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/create-tables-using-vector-data-type.html
Vector 维度限制和向量大小
Vector 维度和向量大小如下:
- Oracle AI Vector Search 向量支持最多 65,535 个维度。
- Oracle AI Vector Search 向量维度的数值格式支持BINARY、INT8、FLOAT32 和 FLOAT64 格式。
- Oracle AI Vector Search 向量的大小等于维度数与每个维度的字节大小的乘积。
向量大小 (字节)=维度数×单个维度的字节数
例如:
2,048 维度 + INT8 格式:2,048 维度 × 1 字节/维度 = 2 KB
1,024 维度 + FLOAT32 格式:1,024 维度 × 4 字节/维度 = 4 KB
向量存储格式(DENSE vs SPARSE)
1. DENSE存储
特点:
每个维度值物理存储,无论是否为0。
默认存储格式。
适用场景:维度值大部分非零的向量。
2. SPARSE存储
特点:
仅存储非零维度值,节省空间。
不支持BINARY格式。
适用场景:维度值大部分为0的向量。
3. 内部存储与空间计算
存储方式:使用Securefile BLOBs存储。
空间估算公式:
DENSE向量:
存储空间 = 向量数 × 维度数 × 单维度字节数
(如FLOAT32为4字节,INT8为1字节)。
SPARSE向量:
存储空间 ≈ 向量数 × [(平均非零维度数 × 4字节) + (非零维度数 × 单维度字节数)]
Oracle VECTOR数据类型的声明格式
参考:
Create Tables Using the VECTOR Data Type
https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/create-tables-using-vector-data-type.html
DENSE存储
SPARSE存储
VECTOR基本操作
创建包括VECTOR类型的表
SQL> CREATE TABLE my_vector_table (id NUMBER, embedding VECTOR);
Table created.
SQL> desc my_vector_table
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
EMBEDDING VECTOR(*, *, DENSE)
SQL>
※VECTOR的声明格式表示向量可以具有任意数量的维度和格式。
插入数据
SQL> INSERT INTO my_vector_table VALUES (1,'[1, 2, 3]');
1 row created.
SQL> commit;
Commit complete.
查询数据
SQL> select * from my_vector_table;
ID
----------
EMBEDDING
--------------------------------------------------------------------------------
1
[1.0E+000,2.0E+000,3.0E+000]
SQL>
当然,和其他数据类型一样,VECTOR也支持增删改操作。
VECTOR相关函数
Oracle Vector DB提供了一系列向量相关函数,用于向量的创建、转换、属性计算及相似性搜索。
1. 向量创建函数
VECTOR() 与 TO_VECTOR()
VECTOR() 与 TO_VECTOR()用于将字符串转换为向量类型。
两者功能相同,支持指定维度数量和数据类型(如float32
、int8
等)。
例:
SELECT VECTOR('[4,3]', 2, float32) FROM dual; -- 创建二维float32向量
SELECT TO_VECTOR('[34.6, 77.8]', 2, float64); -- Oracle 23c起可省略FROM dual
SQL> SELECT VECTOR('[4,3]', 2, float32) FROM dual;
VECTOR('[4,3]',2,FLOAT32)
-----------------------------------------------------------------
[4.0E+000,3.0E+000]
SQL> SELECT TO_VECTOR('[34.6, 77.8]', 2, float64);
TO_VECTOR('[34.6,77.8]',2,FLOAT64)
-------------------------------------------------------------------------
[3.4600000000000001E+001,7.7799999999999997E+001]
使用 Oracle Client 23ai 库或 Thin 模式驱动程序的应用程序,可以直接以字符串或 CLOB 类型插入向量数据。
例:
INSERT INTO my_vector_table VALUES (1,'[1, 2, 3]');
2. 向量属性相关函数
VECTOR_NORM()
VECTOR_NORM()用于计算向量的欧氏距离(原点到向量点的距离),结果类型与输入向量一致。
例:
SELECT VECTOR_NORM(VECTOR('[4,3]', 2, float32)); -- 输出5.0(勾股定理)
SQL> SELECT VECTOR_NORM(VECTOR('[4,3]', 2, float32));
VECTOR_NORM(VECTOR('[4,3]',2,FLOAT32))
--------------------------------------
5.0E+000
SQL>
VECTOR_DIMENSION_COUNT()
VECTOR_DIMS()和VECTOR_DIMENSION_COUNT()相同, 用于返回向量的维度数量。
例:
SELECT VECTOR_DIMENSION_COUNT(VECTOR('[34.6,77.8,9]', 3, float32)); -- 输出3
SQL> SELECT VECTOR_DIMENSION_COUNT(VECTOR('[34.6,77.8,9]', 3, float32));
VECTOR_DIMENSION_COUNT(VECTOR('[34.6,77.8,9]',3,FLOAT32))
---------------------------------------------------------
3
SQL>
VECTOR_DIMENSION_FORMAT()
VECTOR_DIMENSION_FORMAT()用于返回向量元素的数据类型。
例:
SELECT VECTOR_DIMENSION_FORMAT(VECTOR('[34.6,77.8]', 2, float64)); -- 输出FLOAT64
SQL> SELECT VECTOR_DIMENSION_FORMAT(VECTOR('[34.6,77.8]', 2, float64));
VECTOR_DIMENSION_FORMAT(VECTOR('[34.6,77.8]',2,FLO
--------------------------------------------------
FLOAT64
SQL>
3. 向量转换函数
VECTOR_SERIALIZE()与 FROM_VECTOR()
VECTOR_SERIALIZE()与 FROM_VECTOR()两者功能等价,用于将向量转换为字符串或CLOB类型,适用于不支持本地向量绑定的驱动(如JDBC)。
例:
SELECT VECTOR_SERIALIZE(VECTOR('[1.1,2.2,3.3]',3,float32) RETURNING VARCHAR2(1000));
-- 输出'[1.1,2.2,3.3]'
SQL> SELECT VECTOR_SERIALIZE(VECTOR('[1.1,2.2,3.3]',3,float32) RETURNING VARCHAR2(1000));
VECTOR_SERIALIZE(VECTOR('[1.1,2.2,3.3]',3,FLOAT32)RETURNINGVARCHAR2(1000))
--------------------------------------------------------------------------------
[1.10000002E+000,2.20000005E+000,3.29999995E+000]
4. 相似性计算函数
VECTOR_DISTANCE()
VECTOR_DISTANCE()用于计算两个向量之间的数学距离,支持多种距离度量(如EUCLIDEAN
欧氏距离)。常用于相似性搜索(如近邻查询)。
例:
SELECT TO_NUMBER(VECTOR_DISTANCE(
VECTOR('[0,0]', 2, float32),
VECTOR('[4,3]', 2, float32),
EUCLIDEAN
)) AS DISTANCE; -- 输出5.0
SQL> SELECT TO_NUMBER(VECTOR_DISTANCE(
VECTOR('[0,0]', 2, float32),
VECTOR('[4,3]', 2, float32),
EUCLIDEAN
)) AS DISTANCE; 2 3 4 5
DISTANCE
----------
5
SQL>
5. 向量数据的分块管理
VECTOR_CHUNKS()函数主要用于向量数据的分块管理,适用于大规模向量数据集的高效存储、索引构建及查询优化。
参考:
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_chunks.html
6.生成向量嵌入
VECTOR_EMBEDDING ()是Oracle 23ai中用于生成向量嵌入(Vector Embeddings)的核心函数,支持将非结构化数据(文本、图像等)转换为高维向量。
参考:
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_embedding.html
更多参数可以参考如下官方文档。
SQL Language Reference
参考
https://www.oracle.com/database/ai-vector-search/
https://www.oracle.com/database/ai-vector-search/faq/
Create Tables Using the VECTOR Data Type
https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/create-tables-using-vector-data-type.html
Oracle Database New Features
https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/ai_vector_search.html#GUID-ai_vector_search1