開發過程當中無論是出於需求仍是測試,對於數據每每會用到批量操做。oop
因爲踩坑,重點說下批量刪除。測試
對數億級數據批量刪除,每每會踩到坑,這就須要注意啦,一條delete語句,undo段會比較大,未提交是一直受到保護,其餘事物的操做會受到影響,執行時間會比較長或掛起,形成表死鎖。如何批量刪除且不影響其餘事物的操做?這就須要儘可能將大的事物劃分爲小的事物去操做,避免其餘事物的執行。fetch
declare
cursor mycursor is SELECT ROWID FROM TEST WHERE XXX=XXXX order by rowid; <--------按ROWID排序的Cursor,刪除條件是XXX=XXXX,根據實際狀況來定。
type rowid_table_type is table of rowid index by pls_integer;
v_rowid rowid_table_type;
BEGIN
open mycursor;
loop
fetch mycursor bulk collect into v_rowid limit 10000; <--------每次處理10000行搜索,也就是每10000行一提交
exit when v_rowid.count=0;
forall i in v_rowid.first..v_rowid.last
delete from test where rowid=v_rowid(i);
commit;
end loop;
close mycursor;
END;排序
(SQL 遊標:
一、把記錄集傳給遊標;
二、打開遊標
三、開始循環
四、從遊標中取值
五、檢查那一行被返回
六、處理
七、關閉循環
八、關閉遊標)開發
下面一個批量插入腳本,每100條記錄提交一次。it
批量寫入腳本:
begin
for i in 1 .. 100000 loop
insert into test_table
(test_ID,
USER_ID,
CODE,
EXCHANGE_TYPE,
OPERATION_TYPE,
CREATED_DATE)
values
(seq_operation_record.nextval,
to_char(i),
'600000',
'SH',
'i',
to_date('2017-01-03 00:00:00', 'yyyy-mm-dd hh24:mi:ss'));
if mod(i, 100) = 0 then
commit;
end if;
end loop;
end;io