Oracle Delete分批提交

2021-07-08 18:29:34 字數 2298 閱讀 8443

1、oracle delete操作會產生redo log,undo log,即使delete 語句中加上nologging 引數,還是會記錄日誌的,這樣保證了資料安全性,利於rollback。為了不使undo表空間被撐爆,可能需要分批提交,以下是分批提交語句:

declare

cnt number(10):=0;

i number(10):=0;

begin

select count(0) from scott.bigtable where id>1000000;

for i in 1..trunc(cnt/50000)+1 loop

delete from scott.bigtable where id >1000000 and rownum<=50000;

commit;

end loop;

end; /

2、oracle delete 操作不會降低高水位線,而每次查詢還是會掃瞄高水位線下面所有的資料,這樣查詢效率不會因為資料delete掉之後,而提高查詢效率,除非通過壓縮表的空間來降低高水位線。

查詢高水位線語句,其中blocks表示高水位線:

select  table_name,blocks,empty_blocks,num_rows from dba_tables where table_name='***'; 

刪除完收集下統計資訊,可以檢視高水位線並沒有下降:

exec dbms_stats.gather_table_stats('scott','bigtable'); —— 利用dbms_stats包來收集統計資訊,只要是基於cbo的統計資訊都可以用dbms_stats來收集

analyze table tabname compute|estimate|delete   statistics; —— 可以利用analyze來收集一些dbms_stats收集不了的統計資訊,例如empty blocks,還有檢驗儲存格式的有效性

delete 是不會釋放空間的,要想釋放空間,要麼通過匯出資料,truncate表,然後重新插入;要麼通過shrink壓縮表的空間,不過需要開啟row  movement:

alter table tabname enable row movement;

alter table tabname shrink space;

alter table tabname disable row movement;

analyze table tabname compute statistics;

select table_name,blocks,empty_blocks,num_rows from dba_tables where table_name='***';

3、關於oracle delete ,update,insert三種dml操作,對redo,undo 日誌的產生量如下總結:

檢視redo產生量語句:

sql> select b.name,a.value from v$mystat a,v$statname b where a.statistic#=b.statistic# and b.name='redo size';

檢視undo產生兩語句:

select b.name,a.value from v$mystat a,v$statname b where a.statistic#=b.statistic# and b.name='undo change vector size';

從直觀理解來看:

對於insert,  redo中儲存的是記錄的所有值,undo中儲存的是記錄的rowid

對於update,redo中儲存的是rowid和修改後的值,undo中儲存的是rowid和修改前的值

對於delete, redo中儲存的是刪除行的rowid,undo中儲存的是刪除的完整記錄。

但從以上結果來看,顯然有些是相悖的,例如delete的最大.因此,我的直觀理解和實際顯然是有出入的。

實際情況應該是比較複雜,跟記錄大小以及列的數量和修改的列數量有關。 

針對從檢視v$mystat,v$statname來檢視redo size,undo size 的大小,暫時得出如下規律(通過對scott.emp & dept 兩個table 的測試):

1.在進行update、insert 操作時,redo size 在commit 之前是沒有變化的,在 commit 之後才發生變化

2.在進行delete 操作時,redo size 在commit 之前也有變化的,在 commit 之後位元組變化更大

3.在進行update、insert、delete 操作時,undo size 變化是馬上發生的(不管有沒有commit),commit之後size也沒有再擴大

Oracle delete資料後恢復辦法示例

oracle delete資料後恢復辦法示例 1 建立表 sql create table wdongh www.2cto.com 2 id integer,3 name varchar2 60 4 2 插入資料 sql insert into wdongh values 1,wdh 1 rowin...

資料分批顯示

比如 資料來源是個array viewcontroller的這個方法返回資料條數 1是為了顯示 載入更多 的那個cell nsinteger tableview uitableview tableview numberofrowsinsection nsinteger section 處理 載入更多...

分批訓練資料

分批訓練資料用於資料量較多時。import torch import torch.utils.data as data batch size 5x torch.linspace 1,10,10 y torch.linspace 10,1,10 torch dataset data.tensordat...