連續插值,用forall實現。
最開始考慮用記錄表實現,如下的過程。但除錯時出現錯誤。
提示不能引用記錄來實現。PL/SQL: ORA-22806: 不是物件或 REF
set serverout on
declare
i number;
type large_type_no is table number;
type large_type_desc is table varchar2(12);
type large_type_desc1 is table varchar2(12);
large_table large_type;
large_desc large_type_desc;
large_desc1 large_type_desc1;
start_time number(10);
stop_time number(10);
begin
start_time:=dbms_utility.get_time;
for i in 1..1000000 loop
large_table(i):=i+3000000;
large_desc(i):='very fat';
large_desc1(i):='tool';
end loop;
forall i in 1..large_table.count
insert into large1 values(large_table(i),large_desc(i),large_desc1(i));
stop_time:=dbms_utility.get_time;
dbms_output.put_line('總計時間:'|| to_char((start_time-stop_time)/100));
end;
/
SQL> @c: est.sql;
insert into large1 values(large_table(i).no,large_table(i).no_desc,large_table(i
).se_desc);
*
第 15 行出現錯誤:
ORA-06550: 第 15 行, 第 27 列:
PLS-00436: 實施限制: 不能引用記錄的 BULK In-BIND 表的欄位
ORA-06550: 第 15 行, 第 27 列:
PLS-00382: 表示式型別錯誤
ORA-06550: 第 15 行, 第 45 列:
PLS-00436: 實施限制: 不能引用記錄的 BULK In-BIND 表的欄位
ORA-06550: 第 15 行, 第 45 列:
PLS-00382: 表示式型別錯誤
ORA-06550: 第 15 行, 第 68 列:
PLS-00436: 實施限制: 不能引用記錄的 BULK In-BIND 表的欄位
ORA-06550: 第 15 行, 第 68 列:
PLS-00382: 表示式型別錯誤
ORA-06550: 第 15 行, 第 27 列:
PL/SQL: ORA-22806: 不是物件或 REF
ORA-06550: 第 15 行, 第 1 列:
PL/SQL: SQL Statement ignored
然後每個欄位用了一個索引表來實現。
set serverout on
declare
i number;
type large_type_no is table of number index by binary_integer;
type large_type_desc is table of varchar2(12) index by binary_integer;
type large_type_desc1 is table of varchar2(12) index by binary_integer;
large_table large_type_no ;
large_desc large_type_desc;
large_desc1 large_type_desc1;
start_time number(10);
stop_time number(10);
begin
start_time:=dbms_utility.get_time;
for i in 1..1000000 loop
large_table(i):=i+3000000;
large_desc(i):='very fat';
large_desc1(i):='tool';
end loop;
forall i in 1..large_table.count
insert into large1 values(large_table(i),large_desc(i),large_desc1(i));
dbms_output.put_line(large_table.count);
stop_time:=dbms_utility.get_time;
dbms_output.put_line('總計時間:'|| to_char((start_time-stop_time)/100));
end;
/
SQL> @c: est2.sql;
1000000
總計時間:-33.11
PL/SQL 過程已成功完成。
用時33秒,插入100萬條記錄。
而不用批次插入時,以下指令碼:
set serverout on
declare
i number;
start_time number(10);
stop_time number(10);
begin
start_time:=dbms_utility.get_time;
for i in 4000001..5000000 loop
insert into large1 values(i,'safsf','fdgfdgfdg');
end loop;
stop_time:=dbms_utility.get_time;
dbms_output.put_line('總計時間:'|| to_char((start_time-stop_time)/100));
end;
/
SQL> @c: est.sql;
總計時間:-152.03
PL/SQL 過程已成功完成。
100萬用時152秒,是批次的5倍。當然排除掉因為資料增加而造成的寫入成本。但效能提升還是很顯著的。
註釋:forall和bulk collect是對利用多維物件來一次性對資料進行sql操作,減少了pl/sql 和sql間的上下文切換而浪費的時間和資源。對記錄的單條處理,放入了對物件的迴圈處理中,此時全部由pl/sql完成,不需要sql的接介入。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/288166/viewspace-967574/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- scala實現球面插值(Slerp)
- 牛頓插值 C++ 和 Matlab實現C++Matlab
- 數值分析Python實現系列—— 一、拉格朗日插值法Python
- SCSS #{} 插值CSS
- 實驗二 插值方法(android)Android
- 二、插值操作
- MATLAB插值Matlab
- MATLAB一維插值和二維插值 比較Matlab
- 【java】【插值查詢】Java
- 求插值係數
- 最大連續子陣列和的實現陣列
- Mac實用技巧:如何設定長按delete實現連續刪除小技巧!Macdelete
- not in 用外連線實現
- oracle plsql採用for loop和rollback savepoint實現重複值可繼續插入exceptionOracleSQLOOPException
- MTK FAQ:如何實現連續的PCM流播放
- 數值計算 插值與擬合
- 查詢演算法集:順序查詢、二分查詢、插值查詢、動態查詢(陣列實現、連結串列實現)演算法陣列
- c#-string 插值C#
- mapboxgl 中插值表示式的應用場景
- 教你認識Verilog 連續賦值賦值
- 用Java實現斷點續傳(HTTP)Java斷點HTTP
- PL/SQL 批次Bind Forall 的效能表現SQL
- 插值查詢演算法演算法
- Swift 5 字串插值之美Swift字串
- Swift 5 字串插值-簡介Swift字串
- 插值演算法總結演算法
- CoffeeScript攻略3.8:字串插值字串
- 2.Vue插值表示式Vue
- 用c++實現淨現值的計算C++
- 棧是按照順序且連續儲存值
- 用鍵值儲存實現MVCC模式MVC模式
- (詳解)用C語言實現一個能夠連續展開的掃雷。C語言
- WPS演示透過打包實現連續播放檔案
- 插值查詢的簡單理解
- MemoryCache 的原生插值方式淺談
- vue.js插值與表示式Vue.js
- 影象縮放--插值法(opencv,原理)OpenCV
- Qt自定義動畫插值函式QT動畫函式