當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/