Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
Table的学习 ①
 
    又要学习Table了,其实每次学习都会有一些不同的收获。在这本教材里,主要偏重于对对创建Table时的一些边边角角的内容的详细介绍,所以只要能够完全掌握这篇文章,基本上对于Table的理解就可以更进一层。至于那些普通的管理操作,都是浮云。
 
一、管理表的准则
 
    1、创建表之前的设计
 
    一般表的结构由应用开发者负责,数据库管理员负责设置存储参数以及给表定义簇。具体的需要做到:
 
    ① 表被规范化
    ② 每个列具有合适的数据类型
    ③ 最后定义允许空值的列,以便节约存储空间
    ④ 合适的时候对表分簇,以节省存储空间和优化SQL语句性能
 
    2、指定数据块空间参数
 
    在创建每个表的时候,指定PCTFREEPCTUSED参数。
 
    3、指定每个表的位置
 
    在创建表的时候,都用TABLESPACE子句指定合适的表空间,具体意义有:
 
    ① 可以提高数据库系统的性能
    ② 可以减少数据库管理的时间
    ③ 如果被默认创建在SYSTEM空间,会影响Oracle性能
    ④ 相关联的表被随机存储在多个表空间,则管理操作时间会增加
 
    4、考虑并行创建表
 
    如果使用CREATE TABLE ... SELECT ...语句来创建表时,尽量使用并行执行,这样由多个进程一起创建表,会改善创建的效率。
 
    5、考虑创建时使用NOLOGGING
 
    使用NOLOGGING子句可以使创建表时所产生的重做信息量最小,具体好处有:
 
    ① 节省了重做日志文件的空间
    ② 减少了创建表的时间
    ③ 改善了大表的并行创建的性能
 
   注:NOLOGGING子句还指定了不等级后续的用SQL*Loader和INSERT操作所做的直接加载操作,但是后续的DML语句不受影响,任然会产生重做登记。
 
    6、估计表的大小和设置存储参数
 
    ① 通过对表、索引、回滚段、重做日志文件的估计,以决定支持期望的数据库所需磁盘空间,购买合适的硬件设备。
    ② 估计单个表的大小,以便更好管理该表使用的磁盘空间,以配置合适的存储参数,改善I/O性能
 
    7、规划大表
 
    可以设置MAXEXTENTS UNLIMITED来简单规划大表,减少消耗的空间和碎片。具体可以考虑:
 
    ① 将表和索引分开。放入不同的表空间,甚至不同的磁盘。这样在重建索引时也可以更容易找到连续的空间。
    ② 分配足够的临时空间。用于防止排序时临时空间不够。
 
    注:不能更改数据字典来使MAXEXTENTS大于允许的数据库块的最大值。
 
    8、表的限制
 
    ① 包含对象类型的表不能导入Oracle 8之前的数据库中
    ② 当原始数据还在数据库中时,不能将类型和盘区表移动到不同的模式中
    ③ 不能将一个导出的表合并到不同模式中相同名字的表中
    ④ Oracle对表所能具有的列数(或对象类型属性)有限制
 
 
二、创建表
 
    具体的创建方式,以及表的类型,可以参见“Oracle表介绍”。这里简单得介绍一下
 
    1、表创建的格式
 
    CREATE TABLE emp (
    empno NUMBER(5) PRIMARY KEY,
    ename VARCHAR2(15) NOT NULL,
    job VARCHAR2(10),
    mgr NUMBER(5),
    hiredate DATE DEFAULT (sysdate),
    sal NUMBER(7,2),
    comm NUMBER(7,2),
    deptno NUMBER(3) NOT NULL,
    CONSTRAINT dept_fkey REFERENCES dept)
    PCTFREE 10
    PCTUSED 40
    TABLESPACE users
    STORAGE
    (INITIAL 50K
    NEXT 50K
    MAXEXTENTS 10
    PCTINCREASE 25)
 
    2、创建临时表
 
    CREATE GLOBAL TEMPORARY TABLE work_area
    (startdate DATE,
    enddate DATE,
    class CHAR(20))
    ON COMMIT DELETE ROWS;
 
    说明:
    ON COMMIT DELETE ROWS:事务特殊,提交后舍弃表。
    ON COMMIT PRESERVE ROWS:会话特殊,结束会话时才舍弃表。
 
    3、并行创建表
 
    可以通过两种方法来并行创建表:
 
    ① 在CREATE TABLE .. AS SELECT语句中包含了PARALLEL子句
    ② 指定了ALTER SESSION FORCE PARALLEL DDL语句
 
    CREATE TABLE emp_dept
    PARALLEL
    AS SELECT * FROM scott.emp
    WHERE deptno = 10;
 
    4、自动收集表上的统计信息
 
    在CREATE(ALTER) TABLE语句中,加入MONITORING子句,则会使用DBMS_STATS包来自动收集统计数据。
 
    可以通过这个包来收集、修改、查看、导出、导入和删除统计数据。所统计的信息可以使用DBA|ALL|USER_TAB_MODIFICATIONS视图来查看。
 
    取消收集用NOMONITORING语句。
 
 
三、更改表
 
    可以使用ALTER TABLE语句来更改表。更改表可能处于以下的原因:
 
    ● 添加、删除、修改现有的列
    ● 修改数据块空间的使用参数(PCTFREE|PCTUSED)
    ● 修改事务入口配置(INITRANS|MAXTRANS)
    ● 修改存储参数
    ● 将表移动到一个新段或表空间
    ● 明确分配一个盘区或收回未使用的空间
    ● 修改表的日志属性
    ● 修改CACHE|NOCACHE属性
    ● 添加、修改、删除表的相关完整性约束
    ● 启用、停用表的相关完整性约束或触发器
    ● 修改表的并行度
    ● 重命名表
    ● 添加、修改索引结构表的特征
    ● 添加、修改LOB列
    ● 添加、修改对象类型、嵌入的表、Varray列
    ● 启动、停用统计数据采集(MONITORING|NOMONITORING)
 
    下面举例具体操作语句:
 
    1、移动表到一个新段或表空间
 
    ALTER TABLE emp MOVE
    STORAGE
    ( INITIAL 20K
     NEXT 40K
     MINEXTENS 2
     MAXEXTENS 20
     PCTINCREASE 0);
 
    2、手动给表分配存储空间
 
    使用ALTER TABLE语句中的ALLOCATE EXTENT子句来分配新盘区
    使用ALTER TABLE语句中的DEALLOCATE UNUSED子句来明确收回未使用的空间
 
    3、删除列
 
    ALTER TABLE emp DROP COLUMN sal;
    ALTER TABLE emp DROP (sal,comm);
 
    注:不能删除所有的列,不能删除SYS拥有的表的列。
 
    4、标记未使用且删除
 
    ALTER TABLE emp SET UNUSED (sal,comm);
 
    注1:标记未使用的列在查询和数据字典视图中均不显示,新建列可以使用改名字,且相关的约束、索引、统计数据均被删除。
    注2:DBA|ALL|USER_UNUSED_COL_TABS视图中列出所有包含未使用列的表,以及未使用列的个数。
 
    使用以下语句来删除标记为未使用的列:
 
    ALTER TABLE emp DROP UNUSED COLUMNS;
 
 
 
 
posted on 2009-02-11 21:51 decode360 阅读(143) 评论(0)  编辑  收藏 所属分类: 08.DBA

只有注册用户登录后才能发表评论。


网站导航: