前面讨论了普通表的不足和全局临时表的神奇之处后,我们来看一个表设计中及其重要的一个技术:分区表设计,如下图
在如今数据量日益增长的海量数据库时代,分区表技术显得尤为重要,甚至可以说使用得当与否决定到系统的生死。
分区表的特性总体是比较复杂的,前面的普通堆表的两个不足:表记录太大检索慢,delete删除有瑕疵,这两个缺点正好可以被分区表的分区消除和可以高效清理分区数据这两大特点给弥补了。
什么叫分区消除,最通俗的比喻就是,你对某表按月份建立了范围分区,从1月到12月工12个分区,你查询到12月的记录,就不会去访问另外11个区,少做事,这就是分区消除。
那高效分区清理呢,就是如果你想删除某分区的数据,如果直接delete,速度很慢,而且高水平位也不会释放,查询的块依旧很多,这时可以直接truncate这个分区,速度非常快。
虽然听起来轻描淡写的似乎很简单,但是不少技术人员项目应用中都不善于利用分区表的这些特性,最终遭到性能瓶颈,甚是可惜。
分区表类型及原理
分区表的类型有范围分区、列表分区、HASH分区以及组合分区这四种,其中范围分区应用最为广泛,而列表分区次之,在某些场合下也可以考虑使用组合分区(在Oracle11g以前,组合分区的组合方式比较有限),相对而言HASH分区在应用中使用的场景并不多见。
1.范围分区
以上操作完成了范围分区的分区表建表的示例,并且构造出10万条记录插入到分区表中,注意一下5点:
1. 范围分区的关键字为partiton by range,即这三个关键字表示该分区为范围分区
2.values less than 是范围分区特点的语法, 用于指明具体的范围,比如 partition p2 less values less than(TO_DATE('2012-03-01','YYYY-MM-DD')),表示小于3月份的的记录。
3. partition p1 到 partition p_max 表示总共建立 了13个分区。
4. 最后还要注意partition p_max values less than (maxvalue) 的部分,表示超出这些范围的记录全部落在这个分区中,免的出错。
5. 分区表的分区可以分别指定在不同的表空间里,如果不写默认在同一个表空间。
2. 列表分区
以上操作完成了列表分区的分区表建表的实例,构造与之前相同的10万条记录插入到分区表中,同样需要注意一下几点:
1. 列表分区的关键字 为 partition by list ,即这三个关键字表示该分区为列表分区。
2. 不同于之前范围分区的 values less than ,列表分区仅需要 values 即可确定范围,值得注意的是,partition p_592 values(592) 并不是说明取值只能写一个,也可以写多个,比如
partition p_union values(592,593,594).
3. partition p_591 到 partition p_other 表示总共建立了10个分区。
4. 最后还要注意 partition p_other values(default) 的部分,表示不再刚才591 到 599范围的记录全部落在这个默认分区中,避免应用出错。
5. 分区表的分区可分别指定在不同的表空间中,默认为同一个表空间。
3. 散列分区
1. 散列分区的关键字为 partition by hash ,出现这三个关键字即表示当前分区为散列分区。
2. 散列分区与之前两种分区的明显 差别在于:没有指定分区名,而仅仅是指定了分区个数, 如 PARTITIONS 12.
3. 散列分区的个数尽量设置为偶数,比如本例是12个分区,如果是11个或者13个就不妥了,具体原因和Oracle内部架构有关。
4. 可以指定散列分区的表空间,比如增加如下一小段,STORE IN(ts1,ts2,ts,3,ts4,ts5,ts6,ts7,ts8,ts9,ts10,ts11,ts12),表示分区分别在12个不同的表空间里,当然不写出表空间
就是都在同一个表空间里。
4. 组合分区
在Oracle11g之前主要支持 范围-列表 和 范围-散列这两种组合。在Oracle11g以后,还提供了 RANGE-RANGE,LIST-RANGE,LIST-HASH,LIST-LIST这四种组合。