如何處理業務系統中併發比較高的表資料清理工作
1,SQL> set sqlprompt session_130>
session_130>insert into t_free select * from t_free;
2,session_8>truncate table t_free;
truncate table t_free
*
第 1 行出現錯誤:
ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效
說明:如果表上有dml操作時,此時truncate不能操作此表
看來只能用批次刪除,但涉及到問題:
1,空間是否馬上釋放
2,高水位線
3,對於表上dml的阻塞
執行如下plsql時,
declare
cursor cur_1 is select rowid from t_free tt where tt.a<=5000000;
v_rowid varchar2(18);
v_cnt pls_integer;
begin
v_cnt:=0;
open cur_1;
loop
fetch cur_1 into v_rowid;
v_cnt:=cnt+1;
exit when cur_1%notfound;
delete from t_free where rowid=v_rowid;
if v_cnt=1000 then
commit;
v_cnt:=0;
end if;
end loop;
end;
1,空間是否馬上釋放
2,高水位線
3,對於表上dml的阻塞
執行如下plsql時,
declare
cursor cur_1 is select rowid from t_free tt where tt.a<=5000000;
v_rowid varchar2(18);
v_cnt pls_integer;
begin
v_cnt:=0;
open cur_1;
loop
fetch cur_1 into v_rowid;
v_cnt:=cnt+1;
exit when cur_1%notfound;
delete from t_free where rowid=v_rowid;
if v_cnt=1000 then
commit;
v_cnt:=0;
end if;
end loop;
end;
PL/SQL 過程已成功完成。
已用時間: 00: 32: 08.95
小結:用此法發生大量的等待事件為db file sequential read,效能極低
--2次最佳化後的儲存過程如下:
create or replace procedure proc_batch_delete(in_start pls_integer,in_end pls_integer)
as
begin
delete from t_free tt where tt.a between in_start and in_end;
commit;
end;
create or replace procedure proc_batch_delete(in_start pls_integer,in_end pls_integer)
as
begin
delete from t_free tt where tt.a between in_start and in_end;
commit;
end;
改寫的sql依舊等待事件多是:db file sequential read
12:04:11 session_130>exec proc_batch_delete(1,100000);
PL/SQL 過程已成功完成。
12:04:11 session_130>exec proc_batch_delete(1,100000);
PL/SQL 過程已成功完成。
已用時間: 00: 02: 09.56
依次產生各種等待事件
依次展開發分析
依次展開發分析
如果同時在多個會話執行
exec proc_batch_delete(x,y);
exec proc_batch_delete(x,y);
兩個會話交替互換出現
read by other session和
db file scattered read
read by other session和
db file scattered read
--再次最佳化上述的儲存過程
--3次最佳化後的儲存過程如下:
create or replace procedure proc_batch_delete(in_start pls_integer,in_end pls_integer)
as
V_LOGNUM NUMBER; -- 資料庫中擁有的日誌檔案數
V_NEEDARC NUMBER; -- 需要歸檔的日誌檔案數
BEGIN
loop
delete from t_free tt where (tt.a between in_start and in_end) AND rownum < 500;
IF SQL%ROWCOUNT = 0 THEN
EXIT;
END IF;
COMMIT;
end loop;
END;
/
--3次最佳化後的儲存過程如下:
create or replace procedure proc_batch_delete(in_start pls_integer,in_end pls_integer)
as
V_LOGNUM NUMBER; -- 資料庫中擁有的日誌檔案數
V_NEEDARC NUMBER; -- 需要歸檔的日誌檔案數
BEGIN
loop
delete from t_free tt where (tt.a between in_start and in_end) AND rownum < 500;
IF SQL%ROWCOUNT = 0 THEN
EXIT;
END IF;
COMMIT;
end loop;
END;
/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-751833/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何處理系統具有較大併發量?
- 簡述高併發解決思路-如何處理海量資料(中)
- mysql大資料高併發處理MySql大資料
- 非同步任務處理系統,如何解決業務長耗時、高併發難題?非同步
- 高併發的處理方法
- 海量資料的併發處理
- 從併發程式設計到分散式系統-如何處理海量資料(上)程式設計分散式
- 高併發中nginx較優的配置Nginx
- 再談資料的併發處理
- 資料預處理-資料清理
- Apache Tomcat如何高併發處理請求ApacheTomcat
- 【轉】從msql資料庫處理高併發商品超賣SQL資料庫
- 面對高頻業務需求,如何提升實時資料處理能力?
- 併發模型比較模型
- 清理Win7系統的批處理Win7
- Java工作中的併發問題處理方法總結Java
- oracle執行系統比較慢,cpu使用率高的檢查和緊急處理Oracle
- 處理高併發的一般思路
- 針對web高併發量的處理Web
- 構建高併發&高可用&安全的IT系統-高併發部分
- 關於高併發和分散式中的冪等處理分散式
- 高併發系統限流中的演算法演算法
- 搭建高併發、高可用的系統
- Nosql 資料管理系統與模型的比較SQL模型
- 秒殺系統設計中的資料處理
- Java中不同的併發實現的效能比較Java
- 高併發,大資料量系統的資料結構優化思路大資料資料結構優化
- 如何比較兩個資料庫表結構的不同資料庫
- 高階併發:Akka Actors和JavaEE7的EJB比較Java
- sap資料--關於收到部分還款SAP系統兩種處理方法的說明和比較
- 面試題:你工作中碰到的印象比較深的 bug,你怎麼處理的?面試題
- Entity Framework Core中的併發處理Framework
- 升訊威線上客服系統的併發高效能資料處理技術:為多執行緒處理同步資料執行緒
- 轉載:Java處理高併發量訪問的處理總結Java
- oracle資料庫兩表資料比較Oracle資料庫
- 高併發實戰之冪等處理
- 比較兩個表的資料差別
- 資料清理的遺留問題處理(二)