您的位置:首页 > 其它

【学习笔记】分区表和分区索引——概念部分(一)

2015-11-26 15:36 330 查看
上周看了《[三思笔记]全面学习分区表及分区索引.pdf》,按学习顺序记录将学习笔记粘出来如下:

当 表中的数据量不断增加,查询数据的速度就会变慢,程序性能也会降低,这时候或许可以考虑将表分区。表进行分区后,逻辑上表仍然是一个逻辑表,但是由于进行 了分区,就可以将每个分区分别存放到不同的物理文件里(每个分区对应一个段,一个或多个段可以存放到一个表空间,而一个或多个物理文件又可以存放到一个表 空间里,结果就是可能每个分区存放到不同的物理文件里)

一、使用分区的优点:

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

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

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

4、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度

二、Oracle数据库分区的方法有:

1、范围分区(Range)

2、HASH分区(Hash)

3、列表分区(List)

4、复合分区(Composite)

4.1 范围+HASH(range-hash)

4.2 范围+列表(range-list)

三、各种分区的特点:

1、 范围分区是根椐分区键的不同取值范围来划分子集的,关键字RANGE,VALUES LESS THAN;

2、列表分区是根椐分区键的一些离散的取值来划分子集的,关键字 list,VALUES;

3、哈希分区是应用哈希算法将分区键对应到某个子集中去,关键字 hash,PARTITIONS;

4、混合分区只能有两层,第一层是范围分区,第二层可以是列表分区或者哈希分区;

四、分区表的创建:

1、创建 range 分区表
create table t_partition_range(id number,name varchar2(50))
partition by range(id)
(
partition t_range_p1 values less than(10) tablespace test1,
partition t_range_p2 values less than(20) tablespace test2,
partition t_range_p3 values less than(30) tablespace test3,
partition t_range_p4 values less than(maxvalue) tablespace test4
);
注意:分区表存储表空间可选,即可以是同一个表空间也可以是不同表空间;可以写也可以不写,如果不显示写分区存储表空间,
则表空间默认和表所存储表空间一致。

user_part_tables:记录分区的表信息
user_tab_partitions:记录表的分区的信息

对 range 分区表创建 global 或 local 分区索引:
(1)创建global索引range分区:
create index idx_parti_range_id on t_partition_range(id)
global partition by range(id)(
partition i_range_p1 values less than(10),
partition i_range_p2 values less than(20),
partition i_range_p3 values less than(30),
partition i_range_pmax values less than(maxvalue)
);

创建global索引的分区与创建表的分区语句格式完全相同,而且其分区形式与索引所在表的分区形式没有关联关系。
另外需要说明的是:对于range类型的分区表,不是只能创建range分区的global索引,也可以创建hash分区的global索引或其他。
user_part_indexes:记录分区的索引信息
user_ind_partitions:记录索引的分区信息

注意:创建 global 索引分区和创建分区表语法一样;global 各个索引分区所在表空间可以显示写(任意指定)也可以不写,如果不显示写分区存储表空间,则表空间默认和表所存储表空间一致。

(2)创建 local 索引:
drop index idx_parti_range_id;
create index idx_parti_range_id on t_partition_range(id) local;

这个 local 没有指定每个分区索引所在表空间,当然也可以自定义。
create index idx_part_range_id on t_partition_range(id) local(
partition i_range_p1 tablespace test1,
partition i_range_p2 tablespace test2,
partition i_range_p3 tablespace test3,
partition i_range_pmax tablespace test4
);

2、创建 hash 分区
hash 分区的创建有两种方式:
(1)直接指定分区名,分区锁在表空间等信息。
(2)只指定分区数量,和可供使用的表空间。
创建hash分区表:
create table t_partition_hash(id number,name varchar2(50))
partition by hash(id)(
partition t_hash_p1 tablespace test1,
partition t_hash_p2 tablespace test2,
partition t_hash_p3 tablespace test3
);

实现上述效果还可以这样:
create table t_partition_hash3(id number,name varchar2(50))
partition by hash(id)
partitions 2 store in (test1,test2,test3);

注意:分区表个数和存储的表空间个数不是一一对应的,那么这个创建 hash 分区的结果会是什么样的呢?
SQL> select upt.table_name,upt.partitioning_type,upt.partition_count
2 from user_part_tables upt where upt.table_name='T_PARTITION_HASH2';

TABLE_NAME PARTITIONING_TYPE PARTITION_COUNT
------------------------------ ----------------- ---------------
T_PARTITION_HASH2 HASH 5
SQL>
select utp.table_name,utp.partition_name,utp.tablespace_name from
user_tab_partitions utp where utp.table_name='T_PARTITION_HASH3';

TABLE_NAME PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------ -----------------------
T_PARTITION_HASH2 SYS_P128 TEST1
T_PARTITION_HASH2 SYS_P129 TEST2
T_PARTITION_HASH2 SYS_P130 TEST3
T_PARTITION_HASH2 SYS_P131 TEST1
T_PARTITION_HASH2 SYS_P132 TEST2

结果:创建了5个分区,即创建的分区个数和指定个数一致。
创建global索引hash分区
create index idx_part_hash_id on t_partition_hash2(id)
global partition by hash(id)
partitions 8 store in (test1,test2,test3);
如果创建上面这种 global 索引会出现什么情况呢?当然也是创建8个分区索引。

3、创建list分区
create table t_partition_list(id number,name varchar2(50))
partition by list(id)
(
partition t_list_p1 values (1,2,3,4,5,6,7,8,9) tablespace test1,
partition t_list_p2 values (10,11,12,13,14,15,16,17,18,19) tablespace test2,
partition t_list_p3 values (20,21,22,23,24,25,26,27,28,29) tablespace test3,
partition t_list_p4 values (default) tablespace test4
);

4、创建range_hash组合分区
(1)为所有分区各创建4个hash子分区。
create table t_partition_rh(id number,name varchar2(50))
partition by range(id) subpartition by hash(name)
subpartitions 4 store in (test1,test2,test3)
(
partition t_r_p1 values less than(10),
partition t_r_p2 values less than(20),
partition t_r_p3 values less than(30),
partition t_r_p4 values less than(maxvalue)
);
(2)对某个表创建hash子分区
create table t_partition_rh(id number,name varchar2(50))
partition by range(id) subpartition by hash(name)
(
partition t_r_p1 values less than (10) tablespace test1,
partition t_r_p2 values less than (20) tablespace test2,
partition t_r_p3 values less than (30) tablespace test3
(
subpartition t_r_p3_h1 tablespace test1,
subpartition t_r_p3_h2 tablespace test2,
subpartition t_r_p3_h3 tablespace test3
),
partition t_r_p4 values less than (40) tablespace test4
);
(3)给各个分区指定不同的子分区
create table t_partition_rh(id number,name varchar2(50))
partition by range(id) subpartition by hash(name)(
partition t_r_p1 values less than (10),
partition t_r_p2 values less than (20)
(
subpartition t_r_p2_h1,
subpartition t_r_p2_h2
),
partition t_r_p3 values less than (30)
subpartitions 3,
partition t_r_pd values less than (maxvalue)
(
subpartition t_r_p3_h1,
subpartition t_r_p3_h2,
subpartition t_r_p3_h3
)
);
select 由上可知:未显示指定子分区的分区,系统会自动创建一个子分区。
(4)分区模板的应用
oracle提供的分区模板,在指定子分区信赖列之后,制定子分区的存储模板,各个分区即会按照子分区模式创建子分区,如:
create table t_partition_rh(id number,name varchar2(50))
partition by range(id) subpartition by hash(name)
subpartition template(
subpartition h1,
subpartition h2,
subpartition h3,
subpartition h4)
(
partition t_r_p1 values less than (10),
partition t_r_p2 values less than (20),
partition t_r_p3 values less than (30),
partition t_r_pd values less than (maxvalue)
);

创建复合分区 local 索引:
create index idx_part_r1_id on t_partition_rh(id) local;

5、创建 range-list 组合分区
range-list 组合分区的创建和 range-hash 相似,不再举例。

公共准则:
1、如果选择的分区不能确保各分区内记录量的平均值,则这种分区方式有可能是不恰当的。
2、对于分区的表或索引,其所涉及的所有分区,其块大小必须一致。

原文:http://blog.itpub.net/24496749/viewspace-1037956/

相关:深入学习Oracle分区表及分区索引
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: