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';更新存量資料可放到業務較少的凌晨跑。
本帖以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';更新存量資料可放到業務較少的凌晨跑。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30557618/viewspace-1834042/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 11g對大表中新增DEFAULT值的NOT NULL欄位速度有大幅度的提升OracleNull
- 11g中關於表新增欄位default屬性研究
- SQL新增表欄位SQL
- oracle刪除表欄位和oracle表增加欄位Oracle
- Oracle-欄位的新增Oracle
- oracle中判斷欄位是否存在和新增表結構Oracle
- Oracle中的大欄位Oracle
- 在高併發、高負載的情況下,如何給表新增欄位並設定DEFAULT值?負載
- Oracle中檢視所有表和欄位以及表註釋.欄位註釋Oracle
- pydantic 欄位欄位校驗
- ORACLE LOB大欄位維護Oracle
- fastadmin 新增欄位記圖片欄位AST
- oracle 修改表欄位的長度Oracle
- Oracle-給表刪除欄位Oracle
- oracle 11G 新增欄位調整效能Oracle
- Python SqlAlchemy動態新增資料表欄位PythonSQL
- 如何在水晶報表中動態新增欄位
- mysql-欄位設定Default值問題MySql
- mysql建立表的時候對欄位和表新增COMMENTMySql
- Oracle 增加修改刪除欄位與新增註釋Oracle
- Oracle-新增一個欄位並設定日期Oracle
- oracle中如何指定表欄位自增Oracle
- Oracle 建表時LOB欄位語法Oracle
- 如何較方便給上百張資料庫表新增表欄位資料庫
- MybatisPlus經典示例:使用Wrapper查詢指定欄位並新增欄位函式處理MyBatisAPP函式
- Android大廠面試經驗分享Android面試
- Unite’17 開發者大會經驗分享
- Laravel 依賴注入方式驗證表單欄位Laravel依賴注入
- 查詢oracle表的資訊(表,欄位,約束,索引)Oracle索引
- MySQL和Oracle的新增欄位的處理差別MySqlOracle
- Oracle11g新特性 - 快速線上新增not null欄位OracleNull
- Oracle-給表增加欄位和註釋Oracle
- Oracle 帶LOB欄位的表的遷移Oracle
- oracle:聯表更新多個欄位的值Oracle
- 動態為10g資料庫的表新增欄位,到256個欄位,hung住了?資料庫
- oracle檢視該使用者的所有表名字、表註釋、欄位名、欄位註釋、是否為空、欄位型別Oracle型別
- OCM實驗-建立含特殊欄位型別的表型別
- hibernate怎樣處理資料庫表中的有'default'屬性的欄位.資料庫