文章目錄
- 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_tableName Null? Type----------------------------------------- -------- ----------------------------ID NUMBEREMBEDDING 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+000SQL>
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))
---------------------------------------------------------3SQL>
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
--------------------------------------------------
FLOAT64SQL>
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
----------5SQL>
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