什麼是 Oracle AI Database 26ai 的 VECTOR 資料型別 文/恆逸資深講師申建忠
什麼是 Oracle AI Database 26ai 的 VECTOR 資料型別
申建忠 Frank Shen
- 精誠資訊 恆逸教育訓練中心 資深講師
- 技術分類:資料庫
VECTOR 是 Oracle AI Database 26ai 中全新引入的原生資料型別,用來儲存「向量嵌入值」(Vector Embeddings),並支援在資料庫內直接執行語意相似性搜尋(Similarity Search)。
簡單來說,就是讓你把非結構化資料(文字、圖片、音訊等)透過 Embedding 模型轉換成向量後,直接存在 Oracle 資料庫裡面,不用再把資料搬到另外一套向量資料庫(像 Pinecone、Milvus 之類)。
為什麼需要 VECTOR?
傳統的關聯式查詢是做「關鍵字比對」,而 VECTOR能做到「語意搜尋」:
| 傳統搜尋 | 語意搜尋 |
|---|---|
| 搜尋 "dog" → 只回傳有 "dog" 的資料 | 搜尋 "puppy" → 也能回傳有 "dog"、"doggie"、"Labrador" 的資料 |
| 字面相等 | 語意相似 |
在向量空間裡,語意相近的資料點彼此距離比較近,所以「找到最接近的 K 個向量」就等於「找到語意最相關的K個結果」。
建立表格與向量欄位
CREATE TABLE my_vectors (id NUMBER, embedding VECTOR);不指定維度和格式時,可以存入不同維度、不同數值型態的向量(適合開發階段)。
指定維度與格式
CREATE TABLE docs (
doc_id INT,
doc_text CLOB,
doc_vector VECTOR(384, FLOAT32) -- 384 維,FLOAT32 格式
);維度取決於你使用的 Embedding 模型,舉例來說:
- Cohere embed-english-v3.0 : 1024 維
- OpenAI text-embedding-3-large : 3072 維
- Hugging Face all-MiniLM-L6-v2 : 384 維
支援的維度格式(Dimension Format)
| 格式 | 說明 |
|---|---|
| INT8 | 8-bit 整數 |
| FLOAT32 | 32-bit IEEE 浮點數 |
| FLOAT64 | 64-bit IEEE 浮點數 |
| BINARY | 每個維度 1 bit(以 packed UINT8 儲存),儲存空間縮小 32 倍,距離運算可快 40 倍 |
DENSE 與 SPARSE 向量
預設是 DENSE(稠密)向量,每個維度都有值。你也可以建立 SPARSE(稀疏)向量,只儲存非零維度:
-- DENSE(預設)
VECTOR(384, FLOAT32, DENSE)
-- SPARSE(只存非零值,節省空間)
VECTOR(10000, FLOAT32, SPARSE)- Dense 向量:由 BERT、Sentence Transformers 等模型產生,適合語意搜尋。
- Sparse 向量:由 SPLADE、BM25 等模型產生,每個非零維度代表一個關鍵字,適合對關鍵字敏感度要求高的場景。
兩者可以結合做 Hybrid Vector Search(混合搜尋),同時拿到語意 + 關鍵字的最佳效果。
向量值的文字表示
在 SQL 中,向量值用純字串表示(方括號 + 逗號分隔):
-- 建立表格
CREATE TABLE my_vect_tab (word VARCHAR2(10),v01 VECTOR(2, INT8));
-- 插入資料
INSERT INTO my_vect_tab VALUES('A','[1,1]'),('B','[2,1]'),('C','[2,2]'),('D','[1,2]');
-- 查詢
SELECT * FROM my_vect_tab;
"WORD","V01"
"A","[1,1]"
"B","[2,1]"
"C","[2,2]"
"D","[1,2]"距離函數(Distance Functions)
VECTOR_DISTANCE(vector1, vector2, metric)輸入兩個向量,回傳它們之間的距離(BINARY_DOUBLE)
不指定 metric 時,預設使用 COSINE(BINARY 向量預設使用 HAMMING)
支援的度量(Metrics)
| Metric | 說明 |
|---|---|
| COSINE | 餘弦距離(預設) |
| DOT | 內積 |
| EUCLIDEAN | 歐幾里德距離(L1) |
| EUCLIDEAN_SQUARED | 歐幾里德距離但不開根號 |
| MANHATTAN | 曼哈頓距離(L2) |
| HAMMING | 漢明距離 |
| JACCARD | Jaccard 距離(僅限BINARY向量) |
向量運算子(Operator)
| 運算子 | 對等函數 |
|---|---|
| v1<->v2 | VECTOR_DISTANCE(v1, v1, EUCLIDEAN)或L2_DISTANCE(v1,v2) |
| v1<=>v2 | VECTOR_DISTANCE(v1, v1, COSINE)或CONSINE_DISTANCE(v1,v2) |
| v1<#>v2 | -1* VECTOR_DISTANCE(v1, v1, DOT)或INNER_PRODUCT(v1,v2) |
-- 找語意最接近的 5 筆(精確搜尋)
SELECT word,v01,vector_distance(v01,to_vector('[1,0]',2,INT8)) dist
FROM my_vect_tab
ORDER BY dist ASC
FETCH FIRST 5 ROWS ONLY;
"WORD","V01","DIST"
"B","[2,1]",0.10557280900008414
"A","[1,1]",0.29289321881345254
"C","[2,2]",0.29289321881345254
"D","[1,2]",0.5527864045000421
-- 使用向量運算子(更簡潔)
SELECT word,v01,vector_distance(v01,to_vector('[1,0]',2,INT8)) dist
FROM my_vect_tab
ORDER BY v01<=> to_vector('[1,0]',2,INT8) ASC
FETCH FIRST 5 ROWS ONLY;ORA-51812: The vector SQL function VECTOR_DISTANCE() requires all
input vectors to have the same dimension format : encountered dimension formats (INT8, FLOAT32).
解決方法:使用to_vector()變更vector格式
向量索引(Vector Index)
向量索引可以加速搜尋,用近似結果換取效能。Oracle 支援兩種索引:
IVF(Inverted File)索引
基於分區(partition-based)的索引,適合大規模資料。
CREATE VECTOR INDEX vec_v01_idx1 ON my_vect_tab (v01)
ORGANIZATION NEIGHBOR PARTITIONS
DISTANCE COSINE
WITH TARGET ACCURACY 90;HNSW(Hierarchical Navigable Small World)索引
基於圖(graph-based)的索引,適合需要高查詢效能的場景。
CREATE VECTOR INDEX vec_v01_idx2 ON my_vect_tab (v01)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE
WITH TARGET ACCURACY 95;索引參數說明
| 參數 | IVF | HNSW |
|---|---|---|
| DISTANCE | COSINE(預設) | COSINE(預設) |
| WITH TARGET ACCURACY | 1~100 | 1~100 |
| NEIGHBOR PARTITIONS | 分區數(1 ~ 10,000,000) | |
| NEIGHBORS | 最大鄰居數(2 ~ 2048) | |
| EFCONSTRUCTION | 建立時每步考慮的候選數(1 ~ 65535) |
向量運算
VECTOR 型別支援跟數字一樣的運算子,運算會作用在每個維度元素上:
-- 加法
SELECT to_vector('[1,1]',2,INT8)+to_vector('[2,1]',2,INT8);
[3,2]
-- 減法
SELECT to_vector('[1,1]',2,INT8)-to_vector('[2,1]',2,INT8);
[-1,0]
-- 乘法
SELECT to_vector('[1,1]',2,INT8)+to_vector('[2,1]',2,INT8);
[2,1]
--avg(),sum()
SELECT sum(v01),avg(v01) FROM my_vect_tab;
"SUM(V01)","AVG(V01)"
"[6.0E+000,6.0E+000]","[1.5E+000,1.5E+000]"限制(Restrictions)
不能用在以下場景的 VECTOR 欄位:
- IOT(Index-Organized Table)
- Cluster / Cluster Table
- Global Temporary Table
- 分區鍵(Partitioning Key)
- Primary Key、Foreign Key
- Unique / Check Constraint(NOT NULL 除外)
- Default Value
- 非向量索引(B-tree、Bitmap、Text、Spatial 等)
不支援的 SQL 構建(針對 VECTOR 欄位):
- DISTINCT、COUNT DISTINCT
- ORDER BY、GROUP BY(直接用 VECTOR 欄位)
- JOIN 條件中直接使用 VECTOR 欄位
- 比較運算子(>、<、= 等)
總結
VECTOR 資料型別讓 Oracle 從「只能存結構化資料」跨入「能直接處理 AI 語意搜尋」的領域,核心價值在於:
- 不用在資料庫間搬移資料:向量和業務資料在同一個資料庫裡
- 同一個SQL查詢:可以將關聯式過濾 + 向量相似搜尋合併在同一個查詢中
- 完整生態:PL/SQL、JDBC、JSON、External Table、Sharding 全面支援
- 資料庫內建 Embedding:匯入 ONNX 模型後直接用 SQL 產生向量,資料不用離開資料庫
這讓開發者可以用最熟悉的 SQL 來建構 AI 驅動的應用程式,而不用額外維繫一套向量資料庫。


0 意見:
張貼留言