博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

oracle-表

Posted on 2020-01-08 22:01  myuserkill  阅读(322)  评论(0编辑  收藏  举报

7.3.8压缩表数据
 12c开始,oracle提供4中压缩“
    ·基本压缩 --企业版提供,不需要许可证
    ·高级行压缩(11g中称之为OLTP压缩) --企业版提供,需要许可证
    ·仓库压缩(混合列压缩)
    ·归档压缩(混合列压缩)
  ①compress或conpress basic可以启用基本压缩
    eg.create table(.....)compress basic;
        --此时,表的pctfree会设置为0,可以修改
  ②row store compress advanced(11g中使用compress for oltp)可以启用高级行压缩
    eg.create table(.....) row store compress advanced;
  ③使用compress子句创建表空间,该表空间中的表都会继承它的压缩设置:
    eg.create tablespace hr_data
    default row store compress advanced
    datafile '····.dbf'
    size 100m;
  ④对已存在的表启用压缩(基本或高级)
    alter table inv row store compress advanced;
        !!!!oracle不支持压缩列超过255的表
  ⑤对已存在的表启用压缩,不会压缩表中已存在的旧数据。
    要想压缩表中已存在的旧数据,需要使用数据泵重建或者移动表
  ⑥禁用压缩
    alter table inv nocompress;
7.3.9减少重做日志--nologging
  ①间接插入:将表A的块读到buffer cache中,将表B的块读到buffer cache中,在内存中完成修改,
    ,再有dbwr机制将脏块写入磁盘,此过程要写重做日志
  ②直接插入:将表A的块读到buffer cache中,然后直接写入表B的数据文件,此时除了表头块之外,
    表B的数据块并不会出现在buffer cache中。
7.3.10通过查询创建表
  ①语句:create table table_A as select * from table_B;
  ②只想复制表结构,不要数据
    create table table_A as select * from table_B where 1=2;
  ③创建表时不记录日志(增加效率,减少创建时间)
    create table table_A nologging as select * from table_B;

7.4.1获得必须的锁机制
  alter session set ddl_lock_timeout=100; 会话级
      - -在我想使用ddl语句修改表时,有dml语句正在使用排它锁占用资源,
        此语句可以在100s内反复尝试获得排他锁。
  alter system set ddl_lock_timeout=100 scope=both;
7.4.2重命名表
  rename old_name to new_name;
7.4.3增加列
  alter table table_name add(.....);
7.4.4更改列
  alter table table_name modify;
7.4.5重命名列
  alter table table_name rename column old_name to new_name;
7.4.6删除列
  alter table table_name drop column_name;删除列
  alter table table_name set unused (column_name)
  alter table table_name drop unused columns;
7.5显示表的DDL代码
  使用dbms_metadate软件包中的get_ddl函数能以最快速度显示用于创建对象的ddl代码
    select dbms_metadata.get_ddl('object_type','object_name') from dual;
  显示方案中(schema)中所有表的DDL代码
    select dbms_metadata.get_ddl('TABLE',table_name) from user_tables;
  显示其他用户(schema)中对象的ddl代码
    select dbms_metadata.get_ddl('TABLE','object_name',,模式名) from dual

      object_type可以是:表,索引,函数,角色,软件包,物化视图,配置文件,约束,序列和同义词

7.6删除表
  drop table table_name;
  drop table table_name cascade constraint;---有外键约束时
7.7恢复已删除的表
  先检查删除的表是否在回收站里
    show recyclebin;
    flashback table table_name to before drop;
    !!无法对system表空间中的表使用删除恢复操作。
  清空当前用户在回收站中的所有对象
    purge recyclebin;
  清空数据库中所有用户的回收站
    purge dba_recyclebin;
   !!!绕过回收站直接删除表
      drop table table_name purge;(与其相关的索引和触发器也会一并删除)
7.8删除表中的数据
  delete和truncate
    !!!truncate是ddl语句
  truncate语句会释放该表使用的所有空间(定义了minextent除外)
  如果不想释放这些空间:truncate table table_name reuse storage;
  truncate会将高水位线标记为0
    !!#!#!truncate无法删除含有被子表外键约束引用了主键的表,即使子表中不含有数据。
      但是delete可以,因为可以回滚。
7.9查看和调整高水位线标记
  delete不会重置高水位线标记
7.10与高水位线有关的性能问题
  全表扫描:扫描高水位线标记以下的所有数据块。
  在执行直接路径加载操作时,oracle会将数据插入到高水位线标记上方的空间,当时用直接路径机制加载的
  数据被删除后,可能会浪费表中大量未使用的空间。
  检查高水位线下方空间的方法:
    ①autotrace工具
    ②dbms_space软件包
    ③查看数据字典的分区视图
7.10.1跟踪监测高水位线标记下方的空间
  检查高水位线标记下方是否有未使用的空间
    ①set autotrace trace statistics;
    ②运行执行全表扫描的查询命令
    ③对比已处理的行号和逻辑编号(访问的内存和磁盘空间)
      !!!autotrace显示详解:(分析SQL的执行计划的)
        eg.0 recursive calls   --递归调用——执行SQL的时候的产生的递归调用的数量,
                     这个参数和访问数据字典的次数有很大的关系。一般来说,这个参数值不会很大。
      0 db block gets       --DB块取——在发生INSERT,DELETE,UPDATE,SELECT
                     FOR UPDATE的时候,数据库缓冲区中的数据库块的个
                    数。在SELECT语句中一般为0。
      3 consistent gets       --一致性读——除了SELECT FOR UPDATE的时候,从数据
                      库缓冲区中读取的数据块的个数
      2 physical reads       --物理读——执行SQL的过程中,从硬盘上读取的数据快个数
      0 redo size         --重做数——执行SQL的过程中,产生的重做日志的大小
      1875 bytes sent via SQL*Net to client     --通过sql*net发送给客户端的字节数
      424 bytes received via SQL*Net from client      --通过sql*net接受客户端的字节数
      2 SQL*Net roundtrips to/from client --
      0 sorts (memory)            --在内存中发生的排序
      0 sorts (disk)            --不能在内存中发生的排序,需要硬盘来协助
      1 rows processed           --结果的记录数

7.10.2使用dbms_space
    需要执行脚本,放弃
7.10.3查看数据字典的分区视图
    使用dba/all/user_extent视图
      eg.select count(*) from user_extents where segment_name='...';
7.10.4降低高水位线标记
  ·使用truncate
  ·使用alter table ...shrink space
  ·使用alter table ...move
    ①收缩表(要调整高水位线,必须先为表启用行转移功能,所在表空间必须启用自动段管理)
      1>为表启用行移动功能
        alter table table_name enable row movement;
      2>收缩表使用的空间
        alter table table_name shrink space;
      3>通过cascade可以收缩索引段使用的空间
        alter table table_name shrink space cascade;
    ②移动表(在当前表空间或其他重建该表)
      如果当前表空间出现磁盘存储空间问题或者需要降低高水位线,就需要移动表
        alter table table_name move tablespace tablespace_name;
          注:在移动表时可以设置nologging功能,避免生成大量的重做日志
        alter table table_name move tablespace tablespace_name nologging;
  移动表之后,要重建索引:
    alter index index_name rebuild;
7.11创建临时表
    create global temporary table
    on commit preserve rows 基于会话
    /on commit delete rows 基于事务(默认)
      ·全局临时表的数据块发生改变时不会产生重做日志
      ·临时表的事务会生成回滚(撤销)日志,回滚日志会生成重做日志
      ·临时表的重做日志比普通表的重做日志少,因为临时表只会生成与事务回滚有关的重做日志
      ·12c开始,临时表的撤销日志存储在临时表空间中,而不是undo表空间中

  删除临时表时,出现占用。先truncate,再drop
7.12创建索引组织表
  对表中数据的访问大多是通过主键查询实现的情况下,可以使用索引组织表(IOT)提高效率
  索引组织部将主键列值与非主键列值都存储在B树的叶子节点中,已提供卓越的查询速度
  但这是以牺牲insert和update性能为代价的(每次插入或更新后都要重新排序)
    create table prod_sku
    (
    id number,
    sku varchar2(256),
    dtt timestamp(5),
    constraint prod_sku_pk primary key(id)
    )organization index
    including sku --包含此列的之前所有列都存储在表段中,including列后的
              所有列都存储在溢出数据表段中。
    pctthreshold 30 --设置在索引块中为IOT行保留的空间百分比(1-50),默认50
                  索引块必须拥有足以存储主键的空间。
    tablespace test01
     overflow --使用哪个表空间存储溢出数据段
    tablespace test01;

注意两点:
● 创建IOT时,必须要设定主键,否则报错。

● 索引组织表实际上将所有数据都放入了索引中