oracle大表添加字段default經驗分享

當oracle單表數據量上億時,對錶進行alter table aa add column_1 varchar2(2) defalut 'Y';時,效率及安全性是必須考慮的因素。 

本帖以2億的數據表aa舉例: 
alter table aa add column_1 varchar2(2) defalut 'Y'; 
Table altered 
Executed in 3600 seconds 
直接用了一個小時,並且在這過程當中是加上了表級鎖,也就是連查詢都是會被等待的,這是至關危險的操做。

爲何會這樣,原來oracle在執行上面語句時不只要更新數據字典,還會刷新所有的記錄。一次update 2 億條數據固然須要一個小時,而且還會致使undo空間暴漲。

若是咱們把更新數據字典和更新字段值分開,會不會好一點?
alter table aa add column_1 varchar2(2); 
Table altered Executed in 0.016 seconds 
alter table aa modify column_1 varchar2(2) defalut 'Y'; 
Table altered
Executed in 0.003 seconds

答案是快100萬倍,那效果呢?經測試發如今第二種方法不會更新之前的數據,咱們能夠本身寫一個匿名塊循環update,一次commit 10000條,達到效率與安全的完美結合。 

結論:alter table add 語句加上defalut時會刷新存量數據併產生表級鎖,需慎用。特別是大表,生產環境,業務產生期間就應該禁止此操做。
改成add table add不帶缺省值,接着來個alter table aa modify column_1 varchar2(2) defalut 'Y';更新存量數據可放到業務較少的凌晨跑。
 
 http://blog.itpub.net/29827022/viewspace-1593139/
相關文章
相關標籤/搜索