Oracle表设计理念

技术不难,最难的是如何选择

一张表就是一个段,如果该表有索引,一个索引就是一个段。

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值