Oracle中,undo是保存記錄的前鏡像的,我理解如果delete from t;那産生的undo應該和t表的大小差不多,但測試結果卻差的很遠,undo産生的量基本上是t表大小的兩倍,不知道為什麼,難道我理解錯了?下面看下這個奇怪的現象。
可以發現原表也就16.5G,需要删的數據是9G。
這裡忘記截圖了,但是是有300多萬個塊,查看對應占用的undo空間是占了30多G,遠遠超過原表的大小。
從原理上講,UNDO表空間,有四個作用:
1. 回滾事務;
2. 一緻性讀;
3. 事務恢複;
4. 閃回查詢
請教楊長老得到的一些信息:
對于回滾事務,他保存的是修改值的前鏡像,注意,不是修改的數據塊,或者整行記錄的鏡像。
除了考慮表大小之外,還有表上索引的總大小,是否存在觸發器,物化試圖日志等等。另外,看看數據庫級的supplemental log是否打開。
undo是記錄事物修改前鏡像的,而delete的前鏡像就是表中存儲的數據。當然有一些可能會導緻前鏡像比表中的原始數據大,比如壓縮,11g後存在的非空默認值。
另外,undo的記錄一定有一些額外的成本,比如rowid,scn等信息,如果表中行記錄本身很小,那麼這些成本就會顯得非常突出。
如果要非常精确地知道,多出來的每一個信息是多少,确實有些困難,但通過這個實驗,至少能了解到,一次delete操作删除的容量,UNDO為了保存前鏡像,需要占據的容量,要比他多得多,這就是為什麼不推薦一次delete操作删除過多數據的原因之一。
總之,對于delete大量數據的情況一定要分批進行,甯願時間花多點,風險也會少很多,避免意外導緻回滾而造成的數據庫卡頓。
後面會分享更多devops和DBA方面内容,感興趣的朋友可以關注下!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!