陣列介面 批量插入 研究

2021-08-30 17:17:28 字數 2003 閱讀 1600

陣列介面允許你使用陣列變數替代標量變數來進行繫結。當特定的dml語句需要插入或更新大量資料的時候,它就會非常有用。在執行dml語句的時候,不再需要針對每條記錄分別執行一次,而可以將所有必要的值組合進乙個陣列然後僅僅需要執行一次即可,如果紀錄的數量太大,也可以將執行操作拆分成小一點的批次。結果,到資料庫的往返次數將與執行次數的數量成比例地下降。

必須強調的是,沒有應用批量處理時載入的低效能並不是資料庫引擎導致的,而是應用程式本身導致並反過來又受其拖累。

儘管陣列介面對客戶端來講更加有效,資料庫也能從中收益,事實上,陣列介面降低了邏輯讀的數量。

下面將提供一些關於如何在pl/sql、oci、jdbc和odp.net中使用陣列介面的基本資訊。

在pl/sql中,可以使用forall語句來應用陣列介面。在執行乙個dml語句的時候,可以利用它來將資料繫結成陣列傳遞給資料庫引擎。示例**如下:

declare

type t_id is table of t.id%type;

type t_pad is table of t.pad%type;

l_id t_id := t_id();

l_pad t_pad := t_pad();

begin

-- prepare data

l_id.extend(100000);

l_pad.extend(100000);

for i in 1..100000

loop

l_id(i) := i;

l_pad(i) := rpad('*',100,'*');

end loop;

-- insert data

forall i in l_id.first..l_id.last

insert into t values (l_id(i), l_pad(i));

end;

需要特別注意的是,儘管這個語法是基於關鍵字forall的,但這不是乙個迴圈。所有的紀錄都是在一次資料庫呼叫中傳送過去的。

在jdbc中,可以使用批量更新來使用陣列介面(在一次執行操作中插入10萬條記錄)。例如**如下:

sql = "insert into t values (?, ?)";

statement = connection.preparestatement(sql);

for (int i=1 ; i<=100000 ; i++)

statement.executebatch();

statement.close();

3.odp.net

在odp.net中,只要定義好基於陣列的引數,並將屬性arraybindcount設定為儲存在陣列中的值的個數,就可以應用陣列介面了。下面的**片段展示了這一點,它在一次執行操作中插入了10萬條記錄。

decimal idvalues = new decimal[100000];

string padvalues = new string[100000];

for (int i=0 ; i<100000 ; i++)

id = new oracleparameter();

id.oracledbtype = oracledbtype.decimal;

id.value = idvalues;

pad = new oracleparameter();

pad.oracledbtype = oracledbtype.varchar2;

pad.value = padvalues;

sql = "insert into t values (:id, :pad)";

command = new oraclecommand(sql, connection);

command.arraybindcount = 100000;

command.parameters.add(id);

command.parameters.add(pad);

command.executenonquery();

mysql 批量插入 Mysql批量插入分析

前言最近發現幾個專案中都有批次插入資料庫的功能,每個專案中批次插入的寫法有一些差別,所以本文打算對mysql的批次插入做乙個詳細的分析。準備1.jdk1.7,mysql5.6.38 2.準備庫和表 測試與分析 下面準備幾種插入的方式來分析優劣 1.statement插入方式 準備資料,然後通過sta...

Mysql指令碼迴圈批量插入陣列資料

首次寫部落格,不知道說點啥,直接上點乾貨,希望大家指出不足之處,共同進步。儲存過程 巢狀迴圈 mysql陣列概念 變數 擷取字串 字串去掉指定字元 資料表中涉及到某一列必填唯一值,唯一值的處理 清除ordersn中唯一值時間的小數點 update ecjia order info set order...

mybatis批量插入,批量更新

insert into t ingco trade lithium electric product product no,li e product no,transpor report number,msds,transpor report number path,msds path,un tes...