多行資料的批處理之bulk collect
在寫pl/sql的時候,很多時候都會用比較經典的模式,定義一個遊標cursor,然後迴圈從遊標中取值進行處理。
類似下面的格式
declare
cursor xxxx is xxxxx;
begin
loop cur in xxxxx loop
xxxxx
end loop;
end;
/
如果cursor中包含的資料太多的時候,可能會有效能問題,效能的考慮主要在於pl/sql引擎和sql引擎的切換,和程式設計中的上下文環境是類似的。
這個時候可以考慮採用bulk collect 的方式直接一次性讀取資料島快取然後從快取中進一步處理。
這種方式可以打個比方比較形象,比如 你帶著一個新人去完成一個任務,可能一天他要問你100個問題,你是希望他每隔幾分鐘想到了就問你呢,還是讓他自己把問題積累起來,專門設定一個時間來集中回答呢。可能你在忙另外一個事情,他問你一個問題,這個時候就會有上下文環境的切換,等你回答了之後,繼續工作的時候,又一個問題來了,這時候又得進行一次切換。。。。
比方說我們設定一個表test,希望把test裡面的資料選擇性的插入到test_all中去
實現的原始Pl/sql如下:
declare
cursor test_cursors is select object_id,object_name from test;
begin
for test_cursor in test_cursors loop
dbms_output.put_line('object_id: '||test_cursor.object_id);
insert into test_all values(test_cursor.object_id,test_cursor.object_name);
end loop;
commit;
end;
/
如果採用bulk collect 方式,就會是如下的方式:
declare
type id_t is table of test.object_id%type;
type name_t is table of test.object_name%type;
object_id id_t;
object_name name_t;
cursor test_cursors is select object_id,object_name from test;
begin
open test_cursors;
fetch test_cursors bulk collect into object_id,object_name;
close test_cursors;
for i in object_id.FIRST .. object_id.LAST loop
dbms_output.put_line('object_id: '||object_id(i));
insert into test_all values(object_id(i),object_name(i));
end loop;
commit;
end;
/
或者採用隱式遊標的方式:
declare
type id_t is table of test.object_id%type;
type name_t is table of test.object_name%type;
object_id id_t;
object_name name_t;
begin
select object_id,object_name bulk collect into object_id,object_name from test where rownum<20;
for i in object_id.FIRST .. object_id.LAST loop
dbms_output.put_line('object_id: '||object_id(i));
insert into test_all values(object_id(i),object_name(i));
end loop;
commit;
end;
/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347004/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Signac處理bulk ATAC-seq資料
- 大資料爭論:批處理與流處理的C位之戰大資料
- 批處理命令之tree命令
- 06 Windows批處理之整數和浮點資料型別Windows資料型別
- 資料處理之去除重複資料
- Windows 批處理之DATE命令的使用方法Windows
- 07 Windows批處理之檔案操作Windows
- TiDB 7.5.0 LTS 高效能資料批處理方案TiDB
- 多行文字加省略號的處理方法
- 批處理概述
- Apache Beam,批處理和流式處理的融合!Apache
- 05 Windows批處理中的字串和布林資料型別Windows字串資料型別
- Spring Boot 之 Spring Batch 批處理實踐Spring BootBAT
- Python資料處理(二):處理 Excel 資料PythonExcel
- 資料預處理之 pandas 讀表
- 資料處理之欄位合併
- java當中的批處理Java
- JDBC當中的批處理JDBC
- 寫個批處理指令碼來幫忙幹活---遍歷資料夾&字串處理指令碼字串
- 08 Windows批處理之執行編譯後的程式Windows編譯
- 《Spring Batch 權威指南》之“批處理和 Spring”SpringBAT
- 資料處理
- 【大資料】離線批處理計算MapReduce | 複習筆記大資料筆記
- 什麼是批處理
- Dynamics CRM 2013 批處理
- bat 批處理字串操作BAT字串
- window 批處理檔案
- 10 Windows批處理之呼叫例程和bat檔案WindowsBAT
- 大資料學習之Hadoop如何高效處理大資料大資料Hadoop
- ElasticSearch7.4批量匯入_bulkElasticsearch
- 下載資料的處理
- 處理json格式的資料JSON
- 籠統的資料處理
- 用批處理自動建立A-Z共26個空資料夾的命令
- Sklearn之資料預處理——StandardScaler歸一化
- 利用陣列處理批次資料之習題陣列
- (十三)資料庫查詢處理之QueryExecution(2)資料庫
- (十) 資料庫查詢處理之排序(sorting)資料庫排序
- 程式設計師需要懂點的批處理命令之bat(1.0)程式設計師BAT