Table的学习 ②
OK,今天继续学习Table的只是点。今天这内容没什么可说的,主要就是让我知道了,什么叫做联机重定义表。所谓的联机重定义,也就是在不关闭数据库的前提下,修改一些涉及到表的内部存储的特性,这个不是我们说改就能改的,所以需要Oracle提供的包才可以。
四、联机重定义表
联机重定义的意义在于:
● 修改表的存储参数
● 将表移动到相同模式中的不同表空间
● 添加对并行查询的支持
● 添加、删除分区支持
● 重建表以减少碎片
● 将普通表(堆积结构)结构改变为索引结构
● 添加、删除列
使用DBMS_REDEFINITION包进行联机重定义。
1、表的联机重定义步骤
① 调用DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,确认该表是否可以联机重定义。
② 创建一个具有所有所需属性的空的临时过渡表(同一模式中)
③ 调用DBMS_REDEFINITION.START_REDEF_TABLE()启动重定义进程
注:需要提供:重定义对象、临时过渡表、列的映射 (没有映射则默认所有列)
④ 在临时过渡表上创建触发器、索引、授权、约束
注:必须以停用状态进行创建
⑤ 执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()完成重定义。
在此期间完成的工作包括:
* 重定义原始表,使其具有临时过渡表所有的属性、索引、约束、授权、触发器
* 包含临时过渡表的参照约束包含最终的被重定义的表并被启用
注:在这个过程中,原始表会加上一会排他锁(时间很短,且不依赖于表的大小)
重定义过程的最终结果是:
● 原始表按照临时过渡表的属性和特点被重定义
● START_REDEF_TABLE()和FINISH_REDEF_TABLE()期间在临时过渡表上定义的触发器、授权、索引和约束现在定义到被重定义的表上并被启用。
● 原始表上的所有触发器、授权、索引和约束转换到临时表上,删除临时表时将它们删除
● 原始表上定义的任何PL/SQL过程和游标都无效,下次使用时自动生效
2、中间同步
在调用START_REDEF_TABLE()和FINISH_REDEF_TABLE()期间,可能会在原始表上执行大量的DML语句,如果这样,可是使用周期性得使临时表与原始表同步。
可以用DBMS_REDEFINITION.SYNC_INTERIM_TABLE()过程来进行,这个过程可以减少为完成重定义过程而调用FINISH_REDEF_TABLE()时所花的时间。但是在FINISH_REDEF_TABLE()期间原始表被加锁的那一小段时间与是否调用过SYNC_INTERIM_TABLE()无关
3、出错后的中止和清除
如果在重定义中途出错,则调用DBMS_REDEFINITION.ABORT_REDEF_TABLE()。
这个过程会删除与重定义进程相关的临时日志和表。但是临时过渡表相关的对象需要手动删除。
4、举例
重定义以下列:
* 列salary乘以系数1.10并重命名为sal
* 删除phone列
* 添加默认值为10的一个新的deptno列
* 重定义的表按empno列的范围分区
假定已经运行了DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,且表emp可以被重定义,则重定义步骤如下:
① 创建临时过渡表int_emp
CREATE TABLE int_emp
(empno NUMBER PRIMARY KEY,
name VARCHAR2(100),
sal NUMBER,
deptno NUMBER DEFAULT 10)
PARTITION BY RANGE(empno)
(PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE tbs_1,
PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE tbs_2);
② 启动重定义进程
DBMS_REDEFINITION.START_REDEF_TABLE('u1','emp','int_emp','empno empno,name name salary*1.10 sal');
③ 在int_emp上创建触发器、索引和约束。
在重定义的最后一步中,这些将被转移换回原始表。在int_emp上的任何参数约束应被停用。可以定义与临时过渡表相关的任何授权,重定义之后,这些授权将取代原始表上的授权。
④ 可选地,同步临时过渡表
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('u1','emp','int_emp');
⑤ 完成重定义
DBMS_REDEFINITION.FINISH_REDEF_TABLE('u1','emp','int_emp');
--此后表emp被加锁一小段时间,此后表emp被重定义,具有了int_emp的所有属性。
⑥ 删除临时过渡表
5、限制
表的联机重定义有一下限制:
● 表必须有主键才能被联机重定义
● 将被重定义的表和临时过渡表必须有相同的主键列
● 定义过物化视图、物化视图日志的表不能被联机重定义
● 索引结构表的溢出表不能被联机重定义
● 具有用户定义类型(对象、REF、收集、类型化表)的表不能被联机重定义
● 具有FILE列的表不能被联机重定义
● 具有LONG列的表不能被联机重定义(但是有LOB列的表可以)
● 要重定义的表不能是簇的一部分
● SYS和SYSTEM模式中的表不能被联机重定义
● 临时表不能被重定义
● 没有同一级别的子设置值支持
● 在将临时过渡表中的列映射到原始表中的列时,只能使用简单的确切的表达式(例如不允许使用子查询)
● 如果重定义时添加列,在重定义完成之前,不能将其声明为NOT NULL
● 在正被重定义的表和临时过渡表之间没有任何参照约束
五、删除表
使用DROP TABLE语句删除表,使用CASCADE选项来删除相关信息
DROP TABLE emp;
DROP TABLE emp CASCADE CONSTRAINTS; --可以删除子表中的外键约束
删除表时需要注意以下几点:
● 删除表后与表相关的所有索引、触发器也会被删除。
● 与表相关的PL/SQL程序单元仍保留,但无效
● 被删除表的同义词仍保留,使用时返回错误值
● 删除盘区删除块
● 可使用TRUNCATE命令来快速得清空表
六、表信息相关的视图
DBA|ALL|USER_TABLES:表信息。某些列包含了DBMS_STATS包或ANALYZE语句产生的统计信息
DBA|ALL|USER_TAB_COLUMNS:表、视图、簇的列。同样包含了一些统计信息
DBA|ALL|USER_ALL_TABLES:描述数据库中所有关系表和对象表
DBA|ALL|USER_TAB_COMMENTS:表的列和视图的注释
DBA|ALL|USER_COL_COMMENTS:表的列和视图的列的注释
DBA|ALL|USER_EXTERNAL_TABLES:列出数据库中外部表的特殊属性
DBA|ALL|USER_EXTERNAL_LOCATIONS:列数外部表的数据源
DBA|ALL|USER_HISTOGRAMS:描述表和视图上的直方图
DBA|ALL|USER_TAB_COL_STATISTICS:提供相关的TAB_COLUMNS视图中提取出来的列的统计数据和直方图
DBA|ALL|USER_TAB_MODIFICATIONS:记录自上次收集统计信息以来被更改过的表
DBA|ALL|USER_UNUSED_COL_TABS:列出具有未使用列的表,是用ALTER TABLE ... SET UNUSED语句标记的
DBA|ALL|USER_PARTIAL_DROP_TABS:列出部分完成DROP COLUMN操作的表