Oracle大表添加字段

在添加字段时,如果表数据量特别大。给添加的字段设置默认值,会消耗特别长的时间,而且所有行都要被锁住。

在生产系统上,如果没有安排足够长的变更时间,可能会对业务带来严重的影响。

对于这种情况,可以使用下面的语句:

alter table table_name add new_column data_type(precision) default 'value_string' not null;

也就是default + not null 这两个关键词组合的方式。

使用这种方法添加的字段,并不会真的修改每行的值,而是在sys.ecol$ 里添加一行数据,记录下该字段的默认值。

虽然没有进行物理存储,但是对查询、数据泵等操作都没有影响 。

可以看下面示例:

SQL> col tabobj# for 999999999

SQL> col column for a20

SQL> col binarydefval for 99999999999999999999

SQL> select * from sys.ecol$;

未选定行

SQL> alter table test_object add create_user varchar2(30) default 'halberd' not null;

表已更改。

SQL> col tabobj# for 999999999

SQL> col column for a20

SQL> col defval for a15

SQL> select tabobj#,COLNUM, utl_raw.cast_to_varchar2(binarydefval) as defval from sys.ecol$;

TABOBJ# COLNUM DEFVAL

---------- ---------- ---------------

247703 27 halberd

SQL> select object_id,object_name from dba_objects where object_name='TEST_OBJECT';

OBJECT_ID OBJECT_NAME

---------- ------------------------------

247703 TEST_OBJECT

SQL> select column_id from dba_tab_cols where owner='SYSTEM' and table_name='TEST_OBJECT' AND COLUMN_NAME='CREATE_USER';

COLUMN_ID

----------

27

这里我们验证了,该方式添加字段后,在sys.ecol$ 里插入了一行数据 。

下面验证,数据并没有存储到物理行中。

SQL> select max(column_id) from dba_tab_cols where table_name='TEST_OBJECT' AND OWNER='SYSTEM';

MAX(COLUMN_ID)

--------------

27

SQL> update test_object set create_user='halberd' where rownum=1;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select rowid,dbms_rowid.rowid_object(rowid) object_id,

dbms_rowid.rowid_relative_fno(rowid) rfno,

2 3 dbms_rowid.rowid_block_number(rowid) rdbno,

4 dbms_rowid.rowid_row_number(rowid) rno from test_object WHERE ROWNUM<=2;

ROWID OBJECT_ID RFNO RDBNO RNO

------------------ ---------- ---------- ---------- ----------

AAA8eXAABAADz9BAAA 247703 1 999233 0

AAA8eXAABAADz9BAAB 247703 1 999233 1

SQL> select file_id,relative_fno from cdb_data_files where relative_fno=1;

FILE_ID RELATIVE_FNO

---------- ------------

199 1

SQL> alter system dump datafile 199 block 999233;

system altered.

从上面的查询结果来看,表test_object 有27个字段。我添加的新字段,就是第27个字段。如果是dump数据块出来,显示的就是row 26, 因为dump

结果是从row 0 开始的。

下面是dump的数据块中前两行的的内容:

block_row_dump:

tab 0, row 0, @0x3f5

tl: 114 fb: --H-FL-- lb: 0x3 cc: 27

col 0: [ 3] 53 59 53

col 1: [14] 49 5f 46 49 4c 45 23 5f 42 4c 4f 43 4b 23

col 2: *NULL*

col 3: [ 2] c1 0a

col 4: [ 2] c1 0a

col 5: [ 5] 49 4e 44 45 58

col 6: [ 7] 78 77 04 11 01 39 0f

col 7: [ 7] 78 77 04 11 01 39 0f

col 8: [19] 32 30 31 39 2d 30 34 2d 31 37 3a 30 30 3a 35 36 3a 31 34

col 9: [ 5] 56 41 4c 49 44

col 10: [ 1] 4e

col 11: [ 1] 4e

col 12: [ 1] 4e

col 13: [ 2] c1 05

col 14: *NULL*

col 15: [ 4] 4e 4f 4e 45

col 16: *NULL*

col 17: [ 1] 59

col 18: [ 1] 4e

col 19: *NULL*

col 20: [ 1] 4e

col 21: [ 1] 4e

col 22: *NULL*

col 23: *NULL*

col 24: *NULL*

col 25: *NULL*

col 26: [ 7] 68 61 6c 62 65 72 64

tab 0, row 1, @0x1ec4

tl: 94 fb: --H-FL-- lb: 0x0 cc: 22

col 0: [ 3] 53 59 53

col 1: [ 6] 49 5f 4f 42 4a 33

col 2: *NULL*

col 3: [ 2] c1 27

col 4: [ 2] c1 27

col 5: [ 5] 49 4e 44 45 58

col 6: [ 7] 78 77 04 11 01 39 0f

col 7: [ 7] 78 77 04 11 01 39 0f

col 8: [19] 32 30 31 39 2d 30 34 2d 31 37 3a 30 30 3a 35 36 3a 31 34

col 9: [ 5] 56 41 4c 49 44

col 10: [ 1] 4e

col 11: [ 1] 4e

col 12: [ 1] 4e

col 13: [ 2] c1 05

col 14: *NULL*

col 15: [ 4] 4e 4f 4e 45

col 16: *NULL*

col 17: [ 1] 59

col 18: [ 1] 4e

col 19: *NULL*

col 20: [ 1] 4e

col 21: [ 1] 4e

tab 0, row 2, @0x1e67

第一行, tab 0, row 0, @0x3f5 , 最后一个字段是第27个字段(dump 出来的字段数行数据都是从0 开始的)。

SQL> select utl_raw.cast_to_varchar2(replace('68 61 6c 62 65 72 64',' ')) as val from dual;

VAL

--------------------------------------------------------------------------------

halberd

而第二行, tab 0, row 1, @0x1ec4 ,则仅仅dump 出22个字段。说明22个字段之后的内容根本没有存储在数据块中,所以dump的结果没有这些字段的内容。

oracle 大表新增列 慢_Oracle大表添加字段相关推荐

  1. oracle 大表新增列 慢_Oracle DDL性能改进-大表新增列行为分析

    生产过程中常常会遇到对表需要在线增加列,尤其是新增带缺省值的非空列,例如: ALTER TABLE .. ADD COLUMN ( ... NOT NULL DEFAULT ... ) 在Oracle ...

  2. mysql alter table drop constraint_MySQL添加,修改,删除表的列,约束等表的定义。

    ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table ...

  3. oracle修改表字段名备注_Oracle修改表或者字段的注释

    转自:https://www.cnblogs.com/fx-blog/p/7132833.html 语句: comment on table 表名 is '表的注释信息'; comment on co ...

  4. MySQL——导出表,单个表单个列查询以及单个表多个条件查询

    目录 引入,导出表 单个表单个列查询 单个表多个条件查询 引入,导出表 右键表 获得表 遇到关键词的用'``'分割 单个表单个列查询 SELECT nickname,`from` from y_mem ...

  5. oracle修改表字段名备注_oracle修改表名、列名、字段类型、添加表列、删除表列...

    ALTER TABLE SCOTT.TEST RENAME TO TEST1--修改表名 ALTER TABLE SCOTT.TEST RENAME COLUMN NAME TO NAME1 --修改 ...

  6. mysql表空间自增_Oracle 默认表空间问题及自增变量设置

    一. Oracle数据库设置默认表空间问题 DBA们经常会遇到一个这样令人头疼的问题:不知道谁在Oracle上创建了一个用户,创建时,没有给这个用户指定默认表空间,所以这个用户就会采用默认的表空间-- ...

  7. 怎么在Mysql中添加列_mysql如何给表中添加列(字段)?

    mysql给表中添加列的方法:1.使用"ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件];"在末尾添加列:2.使用"ALTER TABLE 表名 A ...

  8. mysql新加一列_mysql如何增加表中新的列?

    mysql中可以使用"ALTER TABLE"语句来增加表中新的列,语法格式"ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件];":默认是 ...

  9. sql追加列mysql_mysql如何给表中添加列(字段)?

    mysql给表中添加列的方法:1.使用"ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件];"在末尾添加列:2.使用"ALTER TABLE 表名 A ...

  10. mysql 表中添加数据类型_MySQL数据表添加字段(三种方式)

    MySQL 数据表是由行和列构成的,通常把表的"列"称为字段(Field),把表的"行"称为记录(Record).随着业务的变化,可能需要在已有的表中添加新的字 ...

最新文章

  1. 过程中存根的作用有_模温机的作用 模压过程中模温机的作用有哪些?
  2. 基础SQL面试题(1)
  3. PyQt5——布局管理
  4. 关于对象、构造函数、原型、原型链、继承
  5. Linux统计某个文件夹下的文件个数、目录个数
  6. Git/SQL/正则表达式练习平台
  7. 为什么子孙后代会讨厌使用java.util.Stack
  8. 简述单片微型计算机屏蔽的作用,单片机原理及应用试题库 - 答案
  9. bzoj1217: [HNOI2003]消防局的设立 [树形dp]
  10. 2017.10.29 软件安装 思考记录
  11. ABP源码分析四十:ZERO的Application和Tenant
  12. 电脑版微信怎么看朋友圈_电脑上也可以看朋友圈,99%的人都不知道!
  13. 旁边一位员工天天跟别人聊天,主管都不敢管,那你当什么主管
  14. fgo梅林服务器维护,FGO针对开挂用户处理公告 封禁账号并回复异常数据
  15. Java 8 stream 流获取 list 中最大值、最小值、总和值、平均值
  16. Docker容器引擎
  17. linux密码安全加固技术-CKEY动态密码技术【顶】
  18. Python 理解 精灵 和 精灵组
  19. 1580_AURIX_TC275_SMU模块初步
  20. JAVA中phrase居左_mymail iText中用文本块(chunk)、短语(Phrase)和段 联合开发网 - pudn.com...

热门文章

  1. java.net.ConnectException: no available server
  2. 中国石油大学(北京)-《 公共社交礼仪 》-​​​​​​​第一阶段在线作业
  3. [随心译]2017.8.5-你家毛茸茸的宠物的荤粮正在加速气候变化
  4. 用original绘制重叠柱状图
  5. 基于java实现PDF转图片图片合成PDF
  6. CISSP-D7-运营安全
  7. 用c++语言写1加到100,C++ 语言实现1加到100(初学者)
  8. Pytorch实战——知识点记录(一)
  9. 拼图游戏代码html5,翻译的HTML5拼图游戏(附源码)
  10. 数据集介绍 - Matting and Segmentation