在大部分情况下,普通堆表可以满足项目的基本需求,但是对于性能要求较高的场合,普通堆表的一些劣势便显现出来:
1、 表更新产生大量的日志
2、 删除记录后无法真正释放空间(如执行delete命令后,再次执行select count(*)语句产生的逻辑读次数还和原来一样,需使用truncate table将表截断才能减少逻辑读)
3、 表记录太大时,检索较慢
4、 在有索引的情况下,索引回表读产生很大的开销
5、 有序插入,不能有序读出(如原来插入1,2,3几条数据,2被删除,再插入4,查询结果为1,4,3)
Oracle提供了全局临时表、分区表、索引组织表、簇表来弥补以上缺点,每种表都有自己的适用场景。下面对几种表进行简要介绍:
一、全局临时表:分为基于事务和基于session的两种。
基于事务的全局临时表在事务提交后(也就是commit后)或者session断开后表数据便自动清空,基于session的是在session断开之后清空。
无论是插入更新还是删除操作都会比普通堆表产生更少的日志。
此外,全局临时表的数据对不同的session是独立的,也就是说不同session访问全局临时表,看到的结果不同(如A连接在临时表中插入10条数据,B连接在同一表中插入1条数据,A查询结果为10条,而B仍然为1条,彼此互不影响)。
二、分区表:包括范围分区、列表分区、HASH分区、组合分区(每个分区是一个段)
范围分区:将表记录按照创建时间范围进行划分。
列表分区:将表记录按照运营区域进行划分(每个运营区域可建一个分区)。
散列分区:不自己指定分区名,而是由系统自动分配,仅仅指定分区个数。
组合分区:两种分区形式的组合,如范围-列表分区。
使用分区表可达到分区消除的效果,提高检索效率,但分区表更适用于大表(一般数据大于上百万条记录),小数据量的表使用分区表可能会降低性能。
三、索引组织表(create table*** organization index)
在索引组织表中,表就是索引,索引就是表。可避免回表读,提高查询效率。但索引组织表适用于更新较少、频繁读取的情况,否则更新时会给数据库带来很大的负担。
四、簇表:本身有序,可避免Order by语句。但是同索引组织表一样,更新操作开销大。