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...