技术不难,最难的是如何选择
一张表就是一个段,如果该表有索引,一个索引就是一个段。
1 普通堆表不足之处
- 表更新有日志开销
- 可在适当场合选择全局临时表
- 表delete操作有瑕疵
- 可在适当场合考虑全局临时表和分区表
- 表记录太大检索慢
- 可在适当场合选择分区表
- 索引回表读开销很大
- 可在适当场合索引组织表
- 有序插入难有序读出
- 可在适当场合选择簇表
表更新日志开销较大
数据库产生多少日志脚本
select a.name, b.value
from v$statname a, v$mystat b
where a.statistic#=b.statistic#
and a.name='redo size';
delete无法释放空间
实际工作中不少性能问题都和delete操作有关,delete是最耗性能的操作,产生的UNDO最多,而且因为UNDO需要REDO是最多的,而REDO是需要REDO保护,所以delete是最消耗性能的。
虽然delete将很多块的记录删除了,但是空块依然保留,Oracle在查询时,依然会查询这些空块。而truncate会使这些空块直接被回收,这些空间也就被释放了。(truncate是一种DDL操作)。就好比,一个房间存储了一些空箱子,delete只是将这些空箱中的东西拿出来,但箱子本身还在,还是会占用空间。tuncate则是将这些箱子,也全部归还。
分区表最实用的功能就是,就是利用truncate table t where...
高效释放空间,普通表没有这个功能。
如果是频繁的delete后insert时,Oracle会首先在这些空块插入数据,是不会出现空块过多的情况。
表记录太大检索较慢
普通表两点瑕疵
- 无须考虑备份,允许不产生日志时普通操作依旧不会产生大量日志,无法节省开销。
- delete操作开销大且无法释放空间。
一个表其实就是一个Segment, 表越大检索越慢。
提高检索的思路,主要的思路就是减少访问BLOCK的个数。提供了两种主要技术:
- 索引
- 分区
有序的数据插入,无法有序读出(散列聚簇表)
如果你把有序的数据插入块中,然后删除了该行,接下来插入行会去填补块中的空余部分,这就无法保证有序了。
2 全局临时表
全局临时表的类型
- 一种是基于会话的全局临时表
drop table t_tmp_session purge;
create global temporary table T_TMP_session on commit preserve rows as select * from dba_objects whre 1=2;
- 一种是基于事务的全局临时表
drop tabl