一、表分区与分区表的区别
表分区只是一种思想,分区表是一种技术实现。
当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO。oracle分区表是oracle数据库提供的一种表分区的实现形式。表进行分区后,逻辑上仍然是一张表,原来的查询SQL同样生效,同时可以采用使用分区查询来优化SQL查询效率,不至于每次都扫描整个表。关于oracle中分区表的查询及删除操作查看http://programmerwind.iteye.com/admin/blogs/2077923。
二、分区表的分类
Oracle分区表分为四类:范围分区表;列表分区表;哈希分区表;组合分区表
范围分区表(常用)
创建一个按字段数据范围分区的表,分区置于指定的不同表空间中
示例代码:
--为各个分区准备独立的表空间(指定不同的表空间,放在不同的磁盘上可以提高查询的效率。放在同一块磁盘上的影响不大,不建议使用默认表空间)
create tablespace test_space01 datafile‘d:/tbs01.dbf’ size 50m
create tablespace test_space02 datafile‘d:/tbs02.dbf’ size 50m
create tablespace test_space03 datafile‘d:/tbs03.dbf’ size 50m
create tablespace test_space04 datafile‘d:/tbs04.dbf’ size 50m
可扩展表空间的建法:
create tablespace 表空间名 datafile '路径' size 5G autoextend on next 1G maxsize unlimited;
--创建分区表,
CREATE TABLE range_example(
range_key_column DATE,
DATA VARCHAR2(20),
ID integer
)
PARTITION BY RANGE(range_key_column)
(
PARTITION part01 VALUES LESS THAN(TO_DATE('2008-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACEtest_space01,
PARTITION part02 VALUES LESS THAN(TO_DATE('2008-08-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE test_space02,
PARTITION part03 VALUES LESS THAN(TO_DATE('2008-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE test_space03,
PARTITION part04 VALUES LESS THAN (MAXVALUE)TABLESPACE test_space04
);
--在表上执行查询
select * from range_example;
--在表分区上执行查询
select * from range_example partition(part01);
列表分区表
创建一个按字段数据列表固定可枚举值分区的表。插入记录分区字段的值必须在列表中,否则不能被插入。
示例代码:
CREATE TABLE list_example(
dnameVARCHAR2(10),
DATA VARCHAR2(20)
)
PARTITION BY LIST(dname)
(
PARTITION part01VALUES('初始登记','转移登记'),
PARTITION part02 VALUES('更名登记','楼盘变更'),
PARTITION part03 VALUES('抵押登记'),
PARTITION part03 VALUES('限制登记')
);
哈希分区表
创建一个按字段数据Hash值分区的表
示例代码:
CREATE TABLE hash_example(
hash_key_column DATE,
DATA VARCHAR2(20)
)
PARTITION BY HASH(hash_key_cloumn)
(
PARTITION part01,
PARTITION part02
);
组合分区表
在分区中可以再建立子分区,以实现分区组合。可任意对上述各类分区进行组合分区。
此例中创建了一个由范围分区和哈希分区组合实现分区的表。
示例代码:
CREATE TABLE range_hash_example(
range_column_key int,
hash_column_key INT,
DATAVARCHAR2(20)
)
PARTITION BY RANGE(range_column_key)
SUBPARTITION BY HASH(hash_column_key)SUBPARTITIONS 2
(
PARTITION part_1 VALUES LESS THAN (100000000)
(
SUBPARTITION part_1_sub_1,
SUBPARTITION part_1_sub_2,
SUBPARTITION part_1_sub_3
),
PARTITION part_2 VALUES LESS THAN (200000000)
(
SUBPARTITION part_2_sub_1,
SUBPARTITION part_2_sub_2
)
);
--注 subpartitions 2 并不是指定subpartition的个数一定为2,实际上每个分区的子分区个数可以不同。如果不指定subpartition的具体明细,则系统按照subpartitions的值指定subpartition的个数生成子分区,名称由系统定义 。
三、关于分区表和索引
在分区表上可以建立三种类型的索引:1和普通表一样的全局索引;2.全局分区索引;3.本地分区索引。
它们之间的区别如下图示:
以表range_example为例。
1.建立普通的索引
create index com_index_range_example_id onrange_example(id);
2.建立本地分区索引
create index local_index_range_example_id onrange_example(id) local;
3.建立全局分区索引
create index gidx_range_exampel_id onrange_example(id)
GLOBAL partition by range(id)
(
part_01 values less than(1000),
part_02 values less than(MAXVALUE)
);
对于分区索引的删除,local index 不能指定分区名称,单独的删除分区索引。
local index 对应的分区会伴随着data分区的删除而一起被删除。globalpartition index 可以指定分区名称,删除某一分区。但是有一点要注意,如果该分区不为空,则会导致更高一级的索引分区被置为UNUSABLE 。
ALTER INDEX gidx_range_exampel_id drop partition part_01 ; 此句将导致part_02 状态为UNUSABLE