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时,必须要设定主键,否则报错。
● 索引组织表实际上将所有数据都放入了索引中