类型 |
语法 |
特点 |
适用场景 |
|
任意维度型 |
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 数据类型选择决策树
创建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));
表已创建。
建表
-- 基础表(任意维度/格式)
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>
Oracle AI Vector提供了一系列向量相关函数,用于向量的创建、转换、属性计算及相似性搜索。
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>
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+000
SYS@FREE>
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
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]
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,...] |