Oracle表分区

来源:互联网 发布:胶州搭建网络 编辑:程序博客网 时间:2024/05/16 08:42

oracle8i起,可以把一个表中的所有行分为几个部分。这种表称为分区表。 

1)优点 

    改善表的查询性能,因为这样ORACLE可能只需搜索一个区(表的一部分)面不是 

整个表就可以完成查询。 

    均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能 

    增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用 

    维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可 

    表更容易管理,因为分区表的数据存放在多个部分中,按分区加载各删除数据比 

在大表中加载和删除数据更容易。 

    备份和恢复操作会执行得更好。分区比被分区的表要小。备份各恢复分区的方法 

要比备份各恢复 整个表的方法多。 

2)建立分区表 

1>范围分区 

    可以使用CREATETABLE命令的PARTTITIONBY RANGE子句: 

CREATETABLEbookshelf_range_part 

(title VARCHAR2(100) PRIMARYKEY, 

publisher  VARCHAR2(20), 

categorynameVARCHAR2(20), 

rating VARCHAR2(2), 

CONSTRAINTcatfk2FOREIGN KEY (categoryname) REFERENCES 

category(categoryname) 

PARTITION BY RANGE(categoryname) 

(PARTITIONpart1VALUESLESS THAN('b')TABLESPACEpart1_ts, 

PARTITIONpart2valuesLESS THAN (MAXVALUE) TABLESPACEpart2ts); 

    MAXVALUE指定了最后一个分区交用来存储在前面几个分区不能存储的数据。 

    可以建立多个分区,每个分区都有自己的上限值,对于每个分区来说,只需要指 

定最大值即可,范围的最小值由ORACLE隐含定义。 

2>散列分区 

    oracle8i引入了散列分区,散列分区通过在分区键值一执行一个散列函数来决定 

数据的物理位置。在范围分区中,分区键值连续的值通常在相同的分区中,而散列分 

区中,连续的分区键值不一定分布在相同的分区中(一般均匀分布在不同的分区中); 

这样在潜在地减少了I/O争用的可能性。 

CREATETABLEbookshelf_hash_part 

(title VARCHAR2(100) PRIMARYKEY, 

publisher  VARCHAR2(20), 

 categoryname VARCHAR2(20), 

rating VARCHAR2(2),

CONSTRAINT catfk_hashFOREIGN KEY (categoryname) 

REFERENCES category(categoryname) 

PARTITIONBYHASH(categoryname) 

PARTITIONS 2 

STOREIN (part1_ts, part2_ts); 

    这各方法将建立SYS_Pnnn的名称的分区,在storein语句中指定的表空间的数据 

目可以不同PATITIAONS中分区的数目。如果分区数目比指定的表空间数目多,分区将 

会以循环的方式分配到表空间中。 

    可以指定分区的名名: 

PARTITIONBYHASH(categoryname) 

(PARTITIONpart1TABLESPACEpart1_ts, 

PARTITIONpart2TABLESPACE part2_ts); 

3>子分区 

    oracle8i起,可以建立分区的分区,即子分区。子分区把范围分区和散列分区结 

合起来。 

CREATETABLE bookshelf_range_hash_part 

(titleVARCHAR2(100) PRIMARYKEY, 

publisher VARCHAR2(20), 

categorynameVARCHAR2(2), 

rating VARCHAR2(2), 

CONSTRAINT catfk3FOREIGN KEY (categoryname) 

REFERENCES category(categoryname) 

PARTITIONBY RANGE(title) 

SUBPARTITION BYHASH (categoryname) 

SUBPARTITIONS 6 

(PARTITIONpart1VALUES LESS THAN('m')TABLESPACEpart1_ts, 

PARTITIONpart2VALUESLESS THAN (MAXVALUE) TABLESPACEpart2ts); 

4>列表分区 

    从oracle 9i起,可以使用列表分区。在列表分区中,告诉ORACLE所有可能的值, 

并将分区指定到插入相应行的分区。 

CREATETABLE bookshelf_list_part 

(title VARCHAR2(100) PRIMARYKEY, 

publisher  VARCHAR2(20), 

categorynameVARCHAR2(20), 

rating VARCHAR2(2), 

CONSTRAINT catfk4FOREIGN KEY (categoryname) 

REFERENCES category(categoryname) 

PARTITIONBYLIST(categoryname) 

(PARTITIONpart1VALUES ('adultfic', 'adultnf','adultref')TABLESPACE

part1_ts, 

PARTITIONpart2VALUES('childrenfic','childrennf','childrenpic')TABLESPACE 

part1_ts); 

    在使用列表分区表时,如果INSERT到分区列的值不在分区的定义中,INSERT的操 

作将产生错误。 

3)索引分区 

1>局部索引 

    索引可以按照表进行分区时所用的分区数来分区(局面部分区)。 

CREATEINDEX bookshelf_list_categoryON bookshelf_list_part(categoryname) 

LOCAL 

(PARTITIONpart1 

TABLESPACE part1_ndx_ts, 

PARTITIONpart2 

TABLESPACE part2_ndx_ts); 

2>全局索引 

    可以使用GLOBAL关键字建立包含多个分区值的全局索引。 

CREATEINDEX bookshelf_list_categoryg ONbookshelf_list_part(publisher) 

GLOBA; 

    局部索引比全局索引容易管理,但全局索引进行唯一性检查的速度可能比局部索 

引快。 

    全局索引建立时global子句允许指定索引的范围值,这个范围值为索引字段的范 

围值: 

CREATEINDEX dinya_idx_tON dinya_test(item_id) 

GLOBALPARTITIONBY RANGE(item_id) 

( PARTITION idx_1VALUESLESS THAN(1000)TABLESPACE dinya_space01, 

PARTITIONidx_2VALUESLESS THAN (10000)TABLESPACEdinya_space02, 

PARTITIONidx_3VALUESLESS THAN (MAXVALUE) TABLESPACEdinya_space03 ); 

    不能为散列分区或子分区建立全局索引。

原创粉丝点击