中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

代碼改變世界

曾經風光無限的(de) Oracle DBA 已經落伍了嗎?

2025-06-12 00:50  AlfredZhao  閱讀(2463)  評論(17)    收藏  舉報

先(xian)講一個(ge)殘酷(ku)的(de)事實,Oracle DBA,若(ruo)仍(reng)停留在純粹(cui)的(de)運維(wei)方(fang)向(xiang),未(wei)來的(de)路(lu)將會(hui)越走越窄,尤其(qi)是在國內的(de)特(te)殊環境下,可以說(shuo)是前途渺茫(mang),舉(ju)步維(wei)艱。

既(ji)然如(ru)此,那Oracle DBA們應該如(ru)何(he)破局(ju)呢?

  • Part1.回顧DBA歷史
  • Part2.走進AI時代
  • Part3.如何破局重生?

Part1:回顧DBA歷史

國內最早期從事Oracle DBA崗位的(de)人(ren)(ren),如今基本已經退(tui)休或接(jie)近退(tui)休狀態,這些(xie)前輩們,除(chu)去混日子的(de)不算,其中運(yun)氣(qi)好的(de)早已實現財務(wu)自由,運(yun)氣(qi)差的(de)也基本能達到(dao)中產水平,那一(yi)代人(ren)(ren)是充(chong)分享受到(dao)了屬(shu)于那個時(shi)代的(de)紅利。

不過,真正的(de)一名合格運維DBA所付出的(de)辛苦(ku)絕對遠高于IT行業各技術崗的(de)平(ping)均水平(ping),無(wu)論是在(zai)他(ta)們漫長技術積累的(de)學(xue)習(xi)之路上,還是從(cong)無(wu)數個深夜(ye)中熬(ao)著心血去保障、值守(shou)、救火(huo)的(de)身影中,都可以了解到他(ta)們的(de)高回報并不是純(chun)時(shi)代紅利,也(ye)是實(shi)(shi)實(shi)(shi)在(zai)在(zai)的(de)付出了太多代價換來的(de)。

無奈(nai)時代變化太快(kuai),后面的(de)(de)故(gu)事就是(shi)(shi),看到(dao)這(zhe)行表面光鮮的(de)(de)從業(ye)者越(yue)來越(yue)多,各種(zhong)水(shui)平參差(cha)不(bu)齊的(de)(de)培(pei)訓機(ji)構泛(fan)濫成災(zai),導致供大(da)于求(qiu),加之市場上同時出現很多專業(ye)做這(zhe)方面服務的(de)(de)公司,同時Oracle數據(ju)庫本身也變得(de)越(yue)來越(yue)穩定,在各種(zhong)因素綜合影響之下(xia),讓Oracle DBA不(bu)再是(shi)(shi)傳奇,最終紅利徹底消失(shi),已(yi)(yi)和其(qi)他普通(tong)崗位沒啥區別,有時還會被同行戲謔曾經(jing)省吃儉用花大(da)幾萬(wan)塊考下(xia)來的(de)(de)OCM認證早已(yi)(yi)沒了含金量。

所以,這么(me)多年來苦(ku)心專研Oracle是都白學了(le)?曾(ceng)經風(feng)光無限(xian)的 Oracle DBA 已經落伍(wu)了(le)嗎?

Part2:走進AI時代

現如今,整個社會都開(kai)始(shi)走進了AI時代(dai)。不過別擔心,Oracle DBA 傳統運維方向有可能(neng)不再景氣,但Oracle技術本身可并不落伍,而且一直(zhi)都是引領技術前沿的(de)。

這不(bu),最近大火的AI,Oracle也是(shi)有全(quan)套解決(jue)方案與之匹(pi)配的。掌(zhang)握了這些技能(neng),不(bu)僅(jin)能(neng)讓(rang)你瞬(shun)間領悟Oracle的Vector Search等新的技能(neng),還(huan)能(neng)讓(rang)自身緊跟AI相(xiang)關技術前沿。

之前和一(yi)些(xie)從事Oracle DBA的(de)朋(peng)友們(men)閑(xian)聊,發現(xian)最難轉變(bian)的(de)是(shi)一(yi)些(xie)使用習(xi)慣。很多老的(de)觀念還是(shi)把(ba)Oracle作為純粹(cui)的(de)老牌(pai)關(guan)(guan)系型(xing)數據庫,對其多模融合的(de)相關(guan)(guan)技術置若罔聞,更(geng)別提什么AI相關(guan)(guan)技術。

所(suo)以導致有些(xie)小伙伴雖然(ran)早已聽(ting)聞Oracle 23ai和AI的緊(jin)密(mi)結合(he),但是(shi)具體到落地(di)究(jiu)竟怎么用,實在是(shi)丈(zhang)二(er)和尚摸不著頭腦。

Part3:如何破局重生?

紙上得來終覺淺,絕(jue)知此事(shi)要躬行。

如果(guo)沒有(you)特別的(de)境(jing)遇,最好的(de)起步指(zhi)導材料依(yi)然來源(yuan)于(yu)Oracle官(guan)方(fang)文檔,關(guan)于(yu)AI,可以看下《Oracle AI Vector Search User's Guide》這(zhe)本(ben)書(shu)。書(shu)中有(you)一章節,就非常適合AI新手來快速體驗到Oracle的(de)AI到底能(neng)做些啥,它就是(shi):

  • SQL Quick Start Using a Vector Embedding Model Uploaded into the Database

該文章提(ti)供了一(yi)組實際可操作的命令(ling),幫助我們快速了解(jie)最核心(xin)的Oracle AI VECTOR Search。現在就(jiu)帶大(da)家一(yi)起體驗下(xia)這(zhe)個過程,一(yi)起輕松(song)踏入AI的浪潮之中。

文章說我們(men)需(xu)要(yao)準備三個類(lei)似于(yu)以下內容的文件:

  • 1.Embedding Model
  • 2.json-relational-duality-developers-guide.pdf
  • 3.oracle-database-23ai-new-features-guide.pdf

其(qi)實就是一(yi)個Embedding模型,兩個PDF文件用于測(ce)試。

而在這個剛開(kai)始的(de)階段,你(ni)完全(quan)不必折騰什么onnx的(de)模型轉換,也(ye)無(wu)需關注其是否支持(chi)中文,更不必花心(xin)思去挑選什么測試材(cai)料,甚至(zhi)連具體(ti)要執行的(de)命令都不需要修改太多,就(jiu)先(xian)按照文檔(dang)的(de)示例一步步做,感受(shou)過之后在進階階段或具體(ti)項(xiang)目中實踐時,再去考慮所有(you)細節(jie)項(xiang)。

上面提到的(de)(de)每(mei)個(ge)文(wen)件都貼心的(de)(de)提供了(le)對(dui)應下載地址,這都是官方(fang)文(wen)檔(dang)中(zhong)直接給出(chu)的(de)(de)安全地址,你(ni)可(ke)以直接wget下載,筆者已親測均可(ke)正常下載:

其中下載下來的這個zip包,解壓unzip all-MiniLM-L12-v2_augmented.zip后,會發現有一個README-ALL_MINILM_L12_V2-augmented.txt ,這個說明文件還非(fei)常詳(xiang)細的給(gei)出了整(zheng)個onnx模型加(jia)載到(dao)Oracle庫內的操作步(bu)驟,大多命令(ling)都可(ke)以稍加(jia)修改直接使用。

梳理關鍵命令,比如就按照我的測(ce)試(shi)環境修改如下(xia):

sqlplus / as sysdba;
alter session set container=ALFRED;

SQL> GRANT DB_DEVELOPER_ROLE, CREATE MINING MODEL TO TPCH;
SQL> CREATE OR REPLACE DIRECTORY DM_DUMP AS '/home/oracle';
SQL> GRANT READ ON DIRECTORY DM_DUMP TO TPCH;
SQL> GRANT WRITE ON DIRECTORY DM_DUMP TO TPCH;
SQL> exit

使(shi)用tpch測試用戶導入ONNX的Embedding模型:

--使用TPCH用戶登錄
sqlplus tpch/tpch@alfred

--刪除模型(可選)
exec DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'ALL_MINILM_L12_V2', force => true);

--加載導入模型:
BEGIN
   DBMS_VECTOR.LOAD_ONNX_MODEL(
        directory => 'DM_DUMP',
                file_name => 'all_MiniLM_L12_v2.onnx',
        model_name => 'ALL_MINILM_L12_V2',
        metadata => JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}'));
END;
/

--查詢導入的EMBEDDING模型:
select model_name, algorithm, mining_function from user_mining_models where  model_name='ALL_MINILM_L12_V2';
 
--測試EMBEDDING模型可用,可以正常返回向量化結果
SELECT VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING 'The quick brown fox jumped' as DATA) AS embedding;

到此,是不是沒有任何難度?
我們就已經(jing)體(ti)驗了Oracle庫(ku)內Embedding Model的(de)導入(ru),以(yi)后你(ni)需(xu)要其他Embedding模(mo)型,也是(shi)同樣方法(fa)導入(ru),只是(shi)有(you)些(xie)需(xu)要格式(shi)轉換(huan)下才可(ke)以(yi),目(mu)前模(mo)型大(da)小限制是(shi)不可(ke)超過(guo)1G。

接下來創建測試表,插入測試數據:
注意這里測試表只有兩個字段,一個是正常的ID列,另一個是BLOB數據類型的data列。
而(er)提到BLOB(Binary Large Object),不(bu)(bu)得不(bu)(bu)說,傳統運維DBA對(dui)這個是(shi)敏感的(de),認(ren)為這種二進制大對(dui)象非結構化(hua)的(de)數(shu)(shu)據(ju)一定不(bu)(bu)要存(cun)在數(shu)(shu)據(ju)庫中,但時代在變化(hua),如(ru)果你(ni)希望數(shu)(shu)據(ju)完全由數(shu)(shu)據(ju)庫管理而(er)非文件(jian)系統,BLOB反而(er)是(shi)不(bu)(bu)二之選。

--如果存在此測試表就先刪除
--drop table documentation_tab purge;

--創建測試表documentation_tab
create table documentation_tab (id number, data blob);

--插入測試數據
insert into documentation_tab values(1, to_blob(bfilename('DM_DUMP', 'json-relational-duality-developers-guide.pdf')));
insert into documentation_tab values(2, to_blob(bfilename('DM_DUMP', 'oracle-database-23ai-new-features-guide.pdf')));
commit;
select dbms_lob.getlength(data) from documentation_tab;

我們看到,這里將之前的兩個PDF文件分別插入到表中的兩行,通過查詢BLOB的數據長度也可以了解占用空間的大小(單位是字節)。

接下來,創建一個關系表來存儲非結構化的chunk以及相關向量。
注意,這里這張表的設計,有文檔ID,有Chunk ID, 有chunk原文數據,有chunk向量化后的數據。
chunk簡單理解就相當(dang)于(yu)(yu)是(shi)將這里的每個PDF文(wen)件(jian)分(fen)解成小段(duan)。至于(yu)(yu)chunk的好(hao)處大家感興趣(qu)可以(yi)自行(xing)搜索了(le)解下,總之,這個做法算是(shi)最佳(jia)實踐(jian)。

--drop table doc_chunks purge;
create table doc_chunks (doc_id number, chunk_id number, chunk_data varchar2(4000), chunk_embedding vector);
 
--一條SQL語句就可以完成操作:
--The INSERT statement reads each PDF file from DOCUMENTATION_TAB, transforms each PDF file into text, chunks each resulting text, then finally generates corresponding vector embeddings on each chunk that is created. All that is done in one single INSERT SELECT statement.
--注意修改model名字為ALL_MINILM_L12_V2
insert into doc_chunks
select dt.id doc_id, et.embed_id chunk_id, et.embed_data chunk_data, to_vector(et.embed_vector) chunk_embedding
from
    documentation_tab dt,
    dbms_vector_chain.utl_to_embeddings(
       dbms_vector_chain.utl_to_chunks(dbms_vector_chain.utl_to_text(dt.data), json('{"normalize":"all"}')),
       json('{"provider":"database", "model":"ALL_MINILM_L12_V2"}')) t,
    JSON_TABLE(t.column_value, '$[*]' COLUMNS (embed_id NUMBER PATH '$.embed_id', embed_data VARCHAR2(4000) PATH '$.embed_data', embed_vector CLOB PATH '$.embed_vector')) et;
 
commit;

這里使用一條SQL就實現了從 documentation_tab 表中讀取文檔數據 (dt.data)、將文檔轉換為文本、將文本分割成多個塊 (chunks)、為每個文本塊生成嵌入向量 (embeddings)、將結果插入到 doc_chunks 表中的整個流程,最終成功插入了1377條數據:

然后,生(sheng)成用于similarity查詢檢索的query_vector:

ACCEPT text_input CHAR PROMPT 'Enter text: '
--different methods of backup and recovery

VARIABLE text_variable VARCHAR2(1000)
VARIABLE query_vector VECTOR
BEGIN
  :text_variable := '&text_input';
  SELECT vector_embedding(ALL_MINILM_L12_V2 using :text_variable as data) into :query_vector;
END;
/
 
PRINT query_vector

使用下面SQL進行相似(si)性檢索,在你的書中(zhong),找到與備份(fen)恢復最相關的前(qian)4個chunk:

SELECT doc_id, chunk_id, chunk_data
FROM doc_chunks
ORDER BY vector_distance(chunk_embedding , :query_vector, COSINE)
FETCH FIRST 4 ROWS ONLY;

--如果你想找指定哪本書,還可以通過where條件來指定:
SELECT doc_id, chunk_id, chunk_data
FROM doc_chunks
WHERE doc_id=1
ORDER BY vector_distance(chunk_embedding , :query_vector, COSINE)
FETCH FIRST 4 ROWS ONLY;

使用(yong)EXPLAIN PLAN 命令(ling)確定優化器是如(ru)何執行的,目前沒有索引,肯定是全(quan)表掃:

EXPLAIN PLAN FOR
SELECT doc_id, chunk_id, chunk_data
FROM doc_chunks
ORDER BY vector_distance(chunk_embedding , :query_vector, COSINE)
FETCH FIRST 4 ROWS ONLY;
 
select plan_table_output from table(dbms_xplan.display('plan_table',null,'all'));

運行多向量相似(si)性檢索,找前兩本最(zui)相關(guan)的書中,前4個最(zui)相關(guan)的塊:

SELECT doc_id, chunk_id, chunk_data
FROM doc_chunks
ORDER BY vector_distance(chunk_embedding , :query_vector, COSINE)
FETCH FIRST 2 PARTITIONS BY doc_id, 4 ROWS ONLY;

創建向量索引:

--創建HNSW類型的向量索引(提前需要確認設置:vector_memory_size)
--alter system set vector_memory_size=1G scope=spfile;
create vector index docs_hnsw_idx on doc_chunks(chunk_embedding)
organization inmemory neighbor graph
distance COSINE
with target accuracy 95;

--如果23ai版本過低,可能還沒有INDEX_SUBTYPE字段
SELECT INDEX_NAME, INDEX_TYPE, INDEX_SUBTYPE
FROM USER_INDEXES;

--如果OK,正常顯示如下:
INDEX_NAME             INDEX_TYPE                     INDEX_SUBTYPE
-------------          ---------------- ---------------------------
DOCS_HNSW_IDX        VECTOR           INMEMORY_NEIGHBOR_GRAPH_HNSW

--使用JSON_SERIALIZE查詢:
SELECT JSON_SERIALIZE(IDX_PARAMS returning varchar2 PRETTY)
FROM VECSYS.VECTOR$INDEX where IDX_NAME = 'DOCS_HNSW_IDX';

--確定在 vector memory area中的內存分配:
select CON_ID, POOL, ALLOC_BYTES/1024/1024 as ALLOC_BYTES_MB, 
USED_BYTES/1024/1024 as USED_BYTES_MB
from V$VECTOR_MEMORY_POOL order by 1,2;

建好索引之后,就可以(yi)進行近似的(de)(de)相似性(xing)檢索(approximate similarity search),在你的(de)(de)書中找到前四條最相關的(de)(de)chunk:

SELECT doc_id, chunk_id, chunk_data
FROM doc_chunks
ORDER BY vector_distance(chunk_embedding , :query_vector, COSINE)
FETCH APPROX FIRST 4 ROWS ONLY WITH TARGET ACCURACY 80;

--同樣,可以where指定第一個文檔,從第一個文檔中找到前四條最相關的chunk:
SELECT doc_id, chunk_id, chunk_data
FROM doc_chunks
WHERE doc_id=1
ORDER BY vector_distance(chunk_embedding , :query_vector, COSINE)
FETCH APPROX FIRST 4 ROWS ONLY WITH TARGET ACCURACY 80;

這次還是用EXPLAIN PLAN 確認優化器如(ru)何解析此(ci)查詢:

EXPLAIN PLAN FOR
SELECT doc_id, chunk_id, chunk_data
FROM doc_chunks
ORDER BY vector_distance(chunk_embedding , :query_vector, COSINE)
FETCH APPROX FIRST 4 ROWS ONLY WITH TARGET ACCURACY 80;
 
select plan_table_output from table(dbms_xplan.display('plan_table',null,'all'));

確認(ren)近似相(xiang)似檢索的(de)向量索引性(xing)能(Determine your vector index performance for your approximate similarity searches.):

--注意修改OWNER_NAME
SET SERVEROUTPUT ON
DECLARE 
    report VARCHAR2(128);
BEGIN 
    report := dbms_vector.index_accuracy_query(
        OWNER_NAME => 'TPCH', 
        INDEX_NAME => 'DOCS_HNSW_IDX',
        qv => :query_vector,
        top_K => 10, 
        target_accuracy => 90 );
    dbms_output.put_line(report); 
END; 
/

現在我們(men)創建一個(ge)新表用于混合(he)檢索:

--
--DROP TABLE documentation_tab2 PURGE;

CREATE TABLE documentation_tab2 (id NUMBER, file_name VARCHAR2(200));

INSERT INTO documentation_tab2 VALUES(1, 'json-relational-duality-developers-guide.pdf');

INSERT INTO documentation_tab2 VALUES(2, 'oracle-database-23ai-new-features-guide.pdf');

COMMIT;

要(yao)創建混(hun)合(he)向量索引,需要(yao)指(zhi)定文件所在的數據存儲。在這(zhe)里(li),我們使用(yong)存儲PDF文件的DM_DUMP目錄:

BEGIN
  ctx_ddl.create_preference('DS', 'DIRECTORY_DATASTORE');
  ctx_ddl.set_attribute('DS', 'DIRECTORY', 'DM_DUMP');
END;
/


--這里23ai較低版本可能報錯,建議使用23.7或以上,創建時間較長耐心等待:
CREATE HYBRID VECTOR INDEX my_hybrid_vector_idx ON documentation_tab2(file_name)
  PARAMETERS ('
                 DATASTORE      DS
                 FILTER         CTXSYS.AUTO_FILTER
                 MODEL          ALL_MINILM_L12_V2
                 VECTOR_IDXTYPE ivf
');

創建(jian)混(hun)合向(xiang)量索(suo)引后,檢查創建(jian)的以下內(nei)部表(biao):

SELECT COUNT(*) FROM DR$my_hybrid_vector_idx$VR;
SELECT COUNT(*) FROM my_hybrid_vector_idx$VECTORS;
DESC my_hybrid_vector_idx$VECTORS
SELECT COUNT(*) FROM DR$MY_HYBRID_VECTOR_IDX$I;

可以通過指定以下參數來運行(xing)第(di)一(yi)次混(hun)合搜索:

The hybrid vector index name
The search scorer you want to use (this scoring function is used after merging results from keyword search and similarity search)
The fusion function to use to merge the results from both searches
The search text you want for your similarity search
The search mode to use to produce the vector search results
The aggregation function to use to calculate the vector score for each document identified by your similarity search
The score weight for your vector score
The CONTAINS string for your keyword search
The score weight for your keyword search
The returned max values you want to see
The maximum number of documents and chunks you want to see in the result

使用文檔(dang)給(gei)出的例子,官方文檔(dang)中缺少了一個冒號,下(xia)面已修正(zheng),可以(yi)直接復制(zhi)使用:

SET LONG 10000

SELECT json_serialize(
    DBMS_HYBRID_VECTOR.SEARCH(
      JSON(
           '{
              "hybrid_index_name" : "my_hybrid_vector_idx",
              "search_scorer"     : "rsf",
              "search_fusion"     : "UNION",
              "vector":
                        {
                          "search_text"   : "How to insert data in json format to a table?",
                          "search_mode"   : "DOCUMENT",
                          "aggregator"    : "MAX",
                          "score_weight"  : 1,
                        },
              "text":
                        {
                         "contains"      : "data AND json",
                         "score_weight"  : 1,
                        },
              "return":
                        {
                          "values"        : [ "rowid", "score", "vector_score", "text_score" ],
                          "topN"          : 10
                        }
            }'
      )
   ) RETURNING CLOB pretty);

結果:

SELECT file_name FROM documentation_tab2 WHERE rowid='AAAayGAAAAAO1ajAAB';

混合向量索引(yin)維護(hu)在(zai)后臺自動完成,最后測試下在(zai)基表中插(cha)入(ru)新行,并運行與上一步相同的混合搜索查詢:

INSERT INTO documentation_tab2 VALUES(3, 'json-relational-duality-developers-guide.pdf');

COMMIT;

這個文件我還沒有下載,運行同樣查詢結果已經多了一組數據:

到這里就告一(yi)(yi)段(duan)落了(le),我們一(yi)(yi)起快速體驗(yan)了(le)AI Vector Search,當(dang)然(ran)很多(duo)細節還值得推敲(qiao),可(ke)以留給后面精進(jin)實踐的階段(duan),筆(bi)者有時間也會持續跟讀者分(fen)享更(geng)多(duo)AI相(xiang)關(guan)技(ji)術實踐。

最(zui)后祝Oracle DBA們在這個變幻莫(mo)測的(de)大環境(jing)下,都能成功轉型,擁抱AI新時代(dai),涅槃重(zhong)生。