13-Oracle 23ai Vector Search VECTOR数据类型和实操
一、Vector数据类型梗概
- 多维度支持:维度数(1-65535),*表示任意维度
- 多种数值格式:INT8/FLOAT32/FLOAT64/BINARY,
- 智能存储优化:支持DENSE/SPARSE存储格式,storage_type:DENSE(默认)或SPARSE
- 毫秒级检索:原生集成相似性搜索算法
1.1 基础分类(按维度定义)
类型 | 语法 | 特点 | 适用场景 | |
任意维度型 | VECTOR | 不限制维度数量 | 开发初期、原型验证 | |
固定维度型 | VECTOR(n) | 固定 n 个维度(1≤n≤65535) | 生产环境(如 768 维文本向量) | |
动态维度型 | VECTOR(*, *) | 运行时确定维度 | 多源异构数据集成 |
1.2 按数值格式分类
类型 | 语法 | 精度 | 空间占用 | 适用场景 |
浮点向量 | VECTOR(n, FLOAT32) | 单精度 | 4字节/维度 | AI 模型嵌入(主流) |
VECTOR(n, FLOAT64) | 双精度 | 8字节/维度 | 科学计算 | |
整型向量 | VECTOR(n, INT8) | 8位整型 | 1字节/维度 | 量化模型、边缘计算 |
二进制向量 | VECTOR(n, BINARY) | 位存储 | 1位/维度 | 指纹/哈希值存储 |
1.3 按存储结构分类
类型 | 语法 | 存储原理 | 优势 | 适用场景 |
密集存储 | VECTOR(n, FORMAT, DENSE) | 全维度物理存储 | 读取速度快 | 常规向量(默认) |
稀疏存储 | VECTOR(n, FORMAT, SPARSE) | 仅存非零值 | 空间节省 70%+ | 推荐系统、用户画像 |
向量存储格式(DENSE vs SPARSE)
1. DENSE存储
特点:
每个维度值物理存储,无论是否为0。
默认存储格式。
适用场景:维度值大部分非零的向量。
2. SPARSE存储
特点:
仅存储非零维度值,节省空间。
不支持BINARY格式。
适用场景:维度值大部分为0的向量。
3. 内部存储与空间计算
存储方式:使用Securefile BLOBs存储。
4.空间计算公式示例:
DENSE:向量数 × 维度数 × 单维度字节数
密集:VECTOR(1024, FLOAT32) = 1024×4 = 4KB
SPARSE:向量数 × [(平均非零维度×4) + (非零维度数×单维度字节数)]
稀疏:VECTOR(10000, FLOAT32, SPARSE)(假设 5% 非零)= (10000×0.05)×4 + 10000×0.05×4 ≈ 4KB
1.4 混合类型(生产常用组合)
类型 | 示例语法 | 典型应用 |
文本嵌入型 | VECTOR(768, FLOAT32) | 存储 BERT/LLM 文本嵌入 |
图像特征型 | VECTOR(2048, FLOAT32) | ResNet 视觉特征提取 |
稀疏推荐型 | VECTOR(10000, FLOAT32, SPARSE) | 用户-商品交互矩阵 |
二进制指纹型 | VECTOR(256, BINARY) | 图片/视频哈希指纹 |
1.5 数据类型选择决策树
二、数据类型实操
2.1 按照VECTOR 数据类型建表
创建Oracle VECTOR 数据类型列的基本语法如下:
VECTOR([dimensions], [format], [storage_type])
SYS@FREE> show pdbs;CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------3 FREEPDB1 READ WRITE NO
--基础表(任意维度/格式)
SYS@FREE> create table vector_demo1 (id number,embedding VECTOR);表已创建。SYS@FREE> select * from vector_demo1;未选定行
--指定维度表
SYS@FREE> CREATE TABLE VECTOR_DEMO2 (ID NUMBER,EMBEDDING VECTOR(1024,INT8));表已创建。
2.2 模拟真实数据操作
建表
-- 基础表(任意维度/格式)
CREATE TABLE products (id NUMBER PRIMARY KEY,name VARCHAR2(100),embedding VECTOR);
-- 指定维度表(商品特征),固定1024维
CREATE TABLE fashion_items (item_id NUMBER,features VECTOR(1024, FLOAT32, DENSE));
表已创建。
-- 固定1024维
CREATE TABLE fashion_items (item_id NUMBER,features VECTOR(1024, FLOAT32, DENSE));
--任意维度2
CREATE TABLE fashion_items2 (item_id NUMBER,features VECTOR);
表已创建。SYS@FREE>
增删改查数据
-- 插入向量(JSON数组格式)
INSERT INTO products VALUES (1, '心外科手术刀', '[0.12, 0.24, 0.35]');
-- 使用VECTOR()函数插入
INSERT INTO fashion_items2 VALUES (1001, VECTOR('[0.8,0.2,0.75]', 1024, FLOAT32));--报错
INSERT INTO fashion_items2 VALUES (1001, VECTOR('', 1024, FLOAT32));
-- 更新向量
UPDATE products SET embedding = '[0.9,0.1,0.3]' WHERE id=1;
-- 删除向量
DELETE FROM fashion_items WHERE item_id=1001;SYS@FREE> INSERT INTO products VALUES (1, '心外科手术刀', '[0.12, 0.24, 0.35]');
已创建 1 行。
SYS@FREE> INSERT INTO fashion_items2 VALUES (1001, VECTOR('', 1024, FLOAT32));
已创建 1 行。
SYS@FREE> UPDATE products SET embedding = '[0.9,0.1,0.3]' WHERE id=1;
已更新 1 行。
SYS@FREE> DELETE FROM fashion_items2 WHERE item_id=1001;
已删除 1 行。
SYS@FREE>
三、VECTOR相关函数
Oracle AI Vector提供了一系列向量相关函数,用于向量的创建、转换、属性计算及相似性搜索。
3.1 向量创建函数
VECTOR() 与 TO_VECTOR()
VECTOR() 与 TO_VECTOR()用于将字符串转换为向量类型。
两者功能相同,支持指定维度数量和数据类型(如float32、int8等)。
-- SELECT 创建二维float32向量
-- Oracle 23 AI 优化后不用FROM dual了
SYS@FREE> SELECT VECTOR('[4,3]', 2, float32) FROM dual;
VECTOR('[4,3]',2,FLOAT32)
-----------------------------------------------------------------
[4.0E+000,3.0E+000]SYS@FREE> SELECT TO_VECTOR('[34.6, 77.8]', 2, float64);TO_VECTOR('[34.6,77.8]',2,FLOAT64)
-------------------------------------------------------------------------
[3.4600000000000001E+001,7.7799999999999997E+001]SYS@FREE>
3.2 向量属性相关函数
VECTOR_NORM()
VECTOR_NORM()用于计算向量的欧氏距离(原点到向量点的距离),结果类型与输入向量一致。
-- 输出5.0(勾股定理)
SYS@FREE> SELECT VECTOR_NORM(VECTOR('[4,3]', 2, float32));VECTOR_NORM(VECTOR('[4,3]',2,FLOAT32))
--------------------------------------5.0E+000SYS@FREE>
3.2 VECTOR_DIMENSION_FORMAT()
VECTOR_DIMENSION_FORMAT()用于返回向量元素的数据类型。
-- 输出FLOAT64
SYS@FREE> SELECT VECTOR_DIMENSION_FORMAT(VECTOR('[11.22,33.44]', 2, float64));VECTOR_DIMENSION_FORMAT(VECTOR('[11.22,33.44]',2,F
--------------------------------------------------
FLOAT64
3.3 向量转换函数
VECTOR_SERIALIZE()与 FROM_VECTOR()
VECTOR_SERIALIZE()与 FROM_VECTOR()两者功能等价,
用于将向量转换为字符串或CLOB类型,适用于不支持本地向量绑定的驱动比如JDBC或类似。
SYS@FREE> SELECT VECTOR_SERIALIZE(VECTOR('[11.11,22.22,33.33]',3,float32) RETURNING VARCHAR2(1000));VECTOR_SERIALIZE(VECTOR('[11.11,22.22,33.33]',3,FLOAT32)RETURNINGVARCHAR2(1000))
------------------------------------------------------------------------------------------------------------------------
[1.11099997E+001,2.22199993E+001,3.33300018E+001]
3.4 相似性计算函数
VECTOR_DISTANCE()
VECTOR_DISTANCE()用于计算两个向量之间的数学距离,支持多种距离度量(如EUCLIDEAN欧氏距离)。常用于相似性搜索(如近邻查询)。
--还是勾股定理,结果为5
SYS@FREE> SELECT TO_NUMBER(VECTOR_DISTANCE(VECTOR('[0,0]', 2, float32),VECTOR('[4,3]', 2, float32),EUCLIDEAN)) AS DISTANCE;DISTANCE
----------5
3.5 向量函数列表
函数类型 | 函数名 | 描述 | 示例 |
创建 | VECTOR() | 创建向量 | SELECT VECTOR('[1,2]',2,FLOAT32) FROM dual → [1.0,2.0] |
属性 | VECTOR_NORM() | 欧氏距离 | SELECT VECTOR_NORM(VECTOR('[3,4]')) → 5.0 |
VECTOR_DIMENSION_COUNT() | 维度计数 | SELECT VECTOR_DIMENSION_COUNT(embedding) → 3 | |
VECTOR_DIMENSION_FORMAT() | 数值格式 | SELECT VECTOR_DIMENSION_FORMAT(features) → FLOAT32 | |
转换 | VECTOR_SERIALIZE() | 向量转字符串 | SELECT VECTOR_SERIALIZE(embedding)→ '[0.12,0.24,0.35]' |
搜索 | VECTOR_DISTANCE() | 相似度计算 | SELECT VECTOR_DISTANCE(v1, v2, EUCLIDEAN) → 0.65 |
AI集成 | VECTOR_EMBEDDING() | 生成文本嵌入 | SELECT VECTOR_EMBEDDING(USING model, 'Oracle AI') → [0.2,0.7,...] |