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;
②运行执行全表扫描的查询命令
③对比已处理的行号和逻辑编号(访问的内存和磁盘空间)
7.10.2使用dbms_space
需要执行脚本,放弃
7.10.3查看数据字典的分区视图
使用dba/all/user_extent视图
eg.select count(*) from user_extents where segment_name='...';

上一篇:[LC] 611. Compress String II


下一篇:十七、hadoop压缩相关