oracle 11g對大表中新增DEFAULT值的NOT NULL欄位速度有大幅度的提升
http://blog.csdn.net/weiwangsisoftstone/article/details/7674916
今天同事問我一個問題他說在一張2000萬的表上增加了一個欄位並欄位一個預設值,執行這條語句(alter table tablename add new_col default ‘col’)一個小時沒有執行完,問我有沒有其他解決方法
我查了一下資料發現
Oracle11g中,在新增一個包含DEFAULT值的NOT NULL欄位,Oracle不會去更新現有的資料,Oracle需要做的不過是將預設值以及對應的表資訊、列資訊一起儲存在一個新增資料字典表ecol$中。這張表利用BLOB欄位儲存ALTER TABLE新增的DEFAULT值
然後我測試一下情況(在11g中測試alter table tablename add new_col default ‘col’ 後代not null和不帶not null的區別)
1.新建一張表test
SQL> create table test (id number,name varchar(10));
表已建立。
2.向test表中插入500000記錄
SQL> begin
2 for i in 1..500000 loop
3 insert into test values(i,'jack');
4 end loop;
5 end;
6 /
PL/SQL 過程已成功完成。
SQL> select count(1) from test;
COUNT(1)
----------
500000
SQL>
SQL> set timing on
3.向表中新增一個新的欄位NEW_COL1帶有預設值如下語句不帶NOT NULL
ALTER TABLE t ADD NEW_COL1 CHAR(10) DEFAULT 'TESTCOLUMN'
SQL> ALTER TABLE test ADD NEW_COL1 CHAR(10) DEFAULT 'TESTCOLUMN';
表已更改。
已用時間: 00: 00: 43.23
SQL>
4. 向表中新增一個新的欄位NEW_COL2帶有預設值語句中帶上 NOT NULL
ALTER TABLE test ADD NEW_COL2 CHAR(10) DEFAULT 'TESTCOLUMN' NOT NULL;
SQL> ALTER TABLE test ADD NEW_COL2 CHAR(10) DEFAULT 'TESTCOLUMN' NOT NULL;
表已更改。
已用時間: 00: 00: 00.25
驚奇的發現兩者差別太大了帶not null的用時不到1秒
這是11g對新增一個not null欄位帶有預設值進行了優化,預設值以及對應的表資訊、列資訊一起儲存在一個新增資料字典表ecol$中
如下:可以查詢test表中新增的預設值
SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME = 'TEST' and owner='IMUSE01';
OBJECT_ID
----------
74063
SQL> select COLNUM,BINARYDEFVAL from ecol$ where TABOBJ#= 74063;
COLNUM
----------
BINARYDEFVAL
--------------------------------------------------------------------------------
4
54455354434F4C554D4E
預設值可以轉換一下:
SQL> SET SERVEROUT ON
SQL> DECLARE
2 V_BLOB VARCHAR2(32767) DEFAULT '54455354434F4C554D4E';
3 BEGIN
4 FOR I IN 1..LENGTH(V_BLOB)/2 LOOP
5 DBMS_OUTPUT.PUT(CHR(TO_NUMBER(SUBSTR(V_BLOB, (I - 1) * 2 + 1, 2), 'XXX')));
6 END LOOP;
7 DBMS_OUTPUT.NEW_LINE;
8 END;
9 /
TESTCOLUMN
PL/SQL 過程已成功完成。
SQL>
相關文章
- 檢視oracle資料庫中,哪些表的欄位是null值比較多Oracle資料庫Null
- 面試題:對NotNull欄位插入Null值 有啥現象?面試題Null
- Oracle-欄位的新增Oracle
- laravel-query-builder 對於欄位 值為 null的排序方式LaravelUINull排序
- mysql建立表的時候對欄位和表新增COMMENTMySql
- oracle中判斷欄位是否存在和新增表結構Oracle
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- oracle 修改表欄位的長度Oracle
- jpa~為欄位新增insert的預設值
- Django日期欄位預設值default=timezone.nowDjango
- 【NULL】Oracle null值介紹NullOracle
- MySQL 更新一個表裡的欄位等於另一個表某欄位的值MySql
- 查詢oracle欄位預設值Oracle
- oracle增加欄位帶預設值Oracle
- MySQL-去掉不為null的欄位MySqlNull
- Elasticsearch 統計某欄位有值的文件數Elasticsearch
- Oracle-批量修改欄位裡面的值Oracle
- ORACLE LOB大欄位維護Oracle
- sql 統計多個欄位的和(如果欄位中含有 null 的處理)SQLNull
- 【Mongo】mongo更新欄位為另一欄位的值Go
- json轉化保留null欄位JSONNull
- 建議beego的ORM,可以實現表欄位註釋的新增GoORM
- Oracle 增加修改刪除欄位與新增註釋Oracle
- Oracle-新增一個欄位並設定日期Oracle
- Drupal 如何得到欄位的值?
- Default Folder X for Mac:提升資料夾訪問速度的終極工具Mac
- fastadmin 新增欄位記圖片欄位AST
- 包括clob segment 大欄位 表的大小統計
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- 給mybatis新增自動建表,自動加欄位的功能MyBatis
- SQL 查詢中的 NULL 值SQLNull
- 去除陣列中的 null 值陣列Null
- -206 錯誤. 在表中找不到對應的資料欄位txt
- 在oracle中,select語句查詢欄位中非純數字值Oracle
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- 能夠大幅度提升敲程式碼速度:IntelliJ Idea的Live模板分享 - Sebastian DaschnerIntelliJIdeaAST
- Mybatis-Plus 更新欄位為 NULLMyBatisNull
- Laravel ORM 中,根據關聯查詢的欄位值,對主查詢排名LaravelORM
- Mysql多欄位大表的幾種優化方法MySql優化