您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關刪除一張大表時為什么undo占用空間接近原表兩倍,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
概述
Oracle中,undo是保存記錄的前鏡像的,我理解如果delete from t;那產生的undo應該和t表的大小差不多,但測試結果卻差的很遠,undo產生的量基本上是t表大小的兩倍,不知道為什么,難道我理解錯了?下面看下這個奇怪的現象。
1. delete了8個小時
2. 原表大小
可以發現原表也就16.5G,需要刪的數據是9G。
3. 查看undo塊
這里忘記截圖了,但是是有300多萬個塊,查看對應占用的undo空間是占了30多G,遠遠超過原表的大小。
為什么undo會占用這么多空間?
從原理上講,UNDO表空間,有四個作用:
回滾事務;
一致性讀;
事務恢復;
閃回查詢
請教楊長老得到的一些信息:
對于回滾事務,他保存的是修改值的前鏡像,注意,不是修改的數據塊,或者整行記錄的鏡像。
除了考慮表大小之外,還有表上索引的總大小,是否存在觸發器,物化試圖日志等等。另外,看看數據庫級的supplemental log是否打開。
undo是記錄事物修改前鏡像的,而delete的前鏡像就是表中存儲的數據。當然有一些可能會導致前鏡像比表中的原始數據大,比如壓縮,11g后存在的非空默認值。
另外,undo的記錄一定有一些額外的成本,比如rowid,scn等信息,如果表中行記錄本身很小,那么這些成本就會顯得非常突出。
如果要非常精確地知道,多出來的每一個信息是多少,確實有些困難,但通過這個實驗,至少能了解到,一次delete操作刪除的容量,UNDO為了保存前鏡像,需要占據的容量,要比他多得多,這就是為什么不推薦一次delete操作刪除過多數據的原因之一。
總之,對于delete大量數據的情況一定要分批進行,寧愿時間花多點,風險也會少很多,避免意外導致回滾而造成的數據庫卡頓。
關于刪除一張大表時為什么undo占用空間接近原表兩倍就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。