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-欄位的新增Oracle
- oracle中判斷欄位是否存在和新增表結構Oracle
- ORACLE LOB大欄位維護Oracle
- oracle 修改表欄位的長度Oracle
- Oracle 增加修改刪除欄位與新增註釋Oracle
- Oracle-新增一個欄位並設定日期Oracle
- fastadmin 新增欄位記圖片欄位AST
- pydantic 欄位欄位校驗
- mysql建立表的時候對欄位和表新增COMMENTMySql
- MybatisPlus經典示例:使用Wrapper查詢指定欄位並新增欄位函式處理MyBatisAPP函式
- Django日期欄位預設值default=timezone.nowDjango
- 如何較方便給上百張資料庫表新增表欄位資料庫
- 表單欄位
- Laravel 依賴注入方式驗證表單欄位Laravel依賴注入
- 使用OGG新增唯一標識欄位到目標表
- Oracle default usersOracle
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- 給mybatis新增自動建表,自動加欄位的功能MyBatis
- Laravel 自定義表單請求驗證忽略某些欄位驗證Laravel
- Android大廠面試經驗分享Android面試
- 包括clob segment 大欄位 表的大小統計
- oracle fga審計(欄位級)Oracle
- 使用hibernate校驗欄位
- 建議beego的ORM,可以實現表欄位註釋的新增GoORM
- MySQL如何檢視新增修改表以及欄位註釋資訊MySql
- 經驗分享
- Mysql多欄位大表的幾種優化方法MySql優化
- MySQL8.0大表秒加欄位,是真的嗎?MySql
- 億級大表線上不鎖表變更欄位與索引索引
- Oracle獲取所有表名資訊和獲取指定表名欄位資訊Oracle
- 如何在Oracle資料庫中查詢表和欄位說明Oracle資料庫
- oracle增加欄位帶預設值Oracle
- 查詢oracle欄位預設值Oracle
- WTForms 欄位 引數 校驗ORM
- 表欄位經常要增加的業務怎麼設計表結構
- mysql資料庫新增和修改欄位MySql資料庫
- laravel生產環境下新增欄位Laravel
- 如何給SAP Cloud for Customer UI上的欄位新增自定義校驗邏輯CloudUI
- MySQL 大欄位問題MySql