oracle大表新增欄位default經驗分享

2021-09-07 08:11:18 字數 916 閱讀 5950

當oracle單錶資料量上億時,對錶進行alter table aa add column_1 varchar2(2) de****t 'y';時,效率及安全性是必須考慮的因素。 

本帖以2億的資料表aa舉例: 

alter table aa add column_1 varchar2(2) de****t '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) de****t 'y'; 

table altered

executed in 0.003 seconds

答案是快100萬倍,那效果呢?經測試發現在第二種方法不會更新以前的資料,我們可以自己寫乙個匿名塊迴圈update,一次commit 10000條,達到效率與安全的完美結合。 

結論:alter table add 語句加上de****t時會重新整理存量資料並產生表級鎖,需慎用。特別是大表,生產環境,業務產生期間就應該禁止此操作。

改為add table add不帶預設值,接著來個alter table aa modify column_1 varchar2(2) de****t 'y';更新存量資料可放到業務較少的凌晨跑。

oracle大表新增欄位default經驗分享

當oracle單錶資料量上億時,對錶進行alter table aa add column 1 varchar2 2 de t y 時,效率及安全性是必須考慮的因素。本帖以2億的資料表aa舉例 alter table aa add column 1 varchar2 2 de t y table a...

Oracle 之 表新增欄位後修改字段順序

工作中遇到 在為乙個表新增欄位後,新增欄位在最後,想調整新增欄位的位置。1 原始方法 新建臨時表以儲存正確的順序 create table a 2 as select column1,colum2,a表中的順序 from a 1 刪除表a 1 drop table a 1 新建a 1並從a 2表中賦...

Oracle 之 表新增欄位後修改字段順序

工作中遇到 在為乙個表新增欄位後,新增欄位在最後,想調整新增欄位的位置。1 原始方法 新建臨時表以儲存正確的順序 create table a 2 as select column1,colum2,a表中的順序 from a 1 刪除表a 1 drop table a 1 新建a 1並從a 2表中賦...