9i10g11g编程艺术——分区

来源:互联网 发布:image lab软件下载 编辑:程序博客网 时间:2024/05/21 06:26
一、表分区机制
行移动的开销比正常的update昂贵得多。因此,如果构建的系统会频繁修改分区键,而且这种修改会导致分区移动,这实在是一个糟糕的设计决策。

1、区间分区
分区区间是严格小于某个值而不是小于或等于某个值。
CREATE TABLE range_example
( range_key_column date ,
  data             varchar2(20)
)
PARTITION BY RANGE (range_key_column)
( PARTITION part_1 VALUES LESS THAN(to_date('01/01/2010','dd/mm/yyyy')),
  PARTITION part_2 VALUES LESS THAN(to_date('01/01/2011','dd/mm/yyyy')),
  PARTITION part_3 VALUES LESS THAN(MAXVALUE)
)
/

2、散列分区
oracle会对分区键应用一个散列函数,以此确定数据应当放在N个分区中的哪一个分区中。oracle建议N是2的一个幂(2、4、8、16等)
为表选择的散列键应当是唯一的一个列或一组列,或者至少有足够多的相异值,以便行能在多个分区上很好(均匀的)分布。
CREATE TABLE hash_example
( hash_key_column   date,
  data              varchar2(20)
)
PARTITION BY HASH (hash_key_column)
( partition part_1 tablespace p1,
  partition part_2 tablespace p2
)
/

3、列表分区
列表分区可以根据离散的值列表来指定一行位于哪个分区。
一旦列表分区表有一个DEFAULT分区,就不能再向这个表中增加更多的分区了。
create table list_example
( state_cd   varchar2(2),
  data       varchar2(20)
)
partition by list(state_cd)
( partition part_1 values ( 'ME', 'NH', 'VT', 'MA' ),
  partition part_2 values ( 'CT', 'RI', 'NY' )
)
/

4、间隔分区
不再需要预先为数据创建分区,而是在插入数据时让数据自己创建分区。
分区列应当能够增加number或interval类型数值。
可以使用alter将一个现有的区间表修改为间隔分区。
create table audit_trail
( ts    timestamp,
  data  varchar2(30)
)
partition by range(ts) 
interval (numtoyminterval(1,'month'))    --每个月的数据分别建立一个新分区
store in (users, example )               --创建新分区使用哪些表空间
(
 partition p0 values less than (to_date('01-01-1900','dd-mm-yyyy'))
)
/

二、索引分区

1、局部索引
局部前缀索引:在这些索引中,分区键在索引定义的前几列上。
局部非前缀索引:这些索引不以分区键作为其列列表的前几列。
要使用局部非前缀索引,必须使用一个允许分区消除的查询来提高性能。
为了保证唯一性,如果想使用一个局部索引来保证这个约束,那么分区键必须包括在约束本身中。

2、全局索引
与局部索引不同,全局索引只有一类,这就是前缀全局索引。如果全局索引的索引键未从该索引的分区键开始,这是不允许的。
原创粉丝点击