2014-08-22 Created By BaoXinjianlinux
1、摘要数据库
一、分区表:并发
随着表的不断增大,对于新纪录的增长、查找、删除等(DML)的维护也更加困难。对于数据库中的超大型表,可经过把它的数据分红若干个小表,从而简化数据库的管理活动。对于每个简化后的小表,咱们称为一个单个的分区oracle
对于分区的访问,咱们不须要使用特殊的SQL查询语句或特定的DML语句,并且能够单独的操做单个分区,而不是整个表。同时能够将不一样分区的数据放置到不 同的表空间,好比将不一样年份的销售数据,存放在不一样的表空间,即年的销售数据存放到TBS_2001,2002年的销售数据存放到TBS_2002,依次 类推,从而实现了分散存储,这将大大的简化大容量表的管理,提升查询性能及I/O并发等。app
对于外部应用程序来讲,虽然存在不一样的分区,且数据位于不一样的表空间,但逻辑上仍然是一张表高并发
可使用SQL*Loader,IMPDP,EXPDP,Import,Export等工具来装载或卸载分区表中的数据工具
关于分区表的功能实际上同SQL server 中的分区表是一样的概念,只不过SQL server中的数据存放到了文件组,至关于Oracle概念中的表空间性能
分区信息管控表:DBA_TAB_SUBPARTITIONS测试
二、什么时候分区ui
当表达到GB大小且继续增加
须要将历史数据和当前的数据分开单独处理,好比历史数据仅仅须要只读,而当前数据则实现DML
三、分区的条件及特性
四、分区的优势
五、分区表类型
六、 分区索引类型
七、 分区表创建四种方式语法
(1)、范围分区表
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-1 00:00:00', 'yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs01, PARTITION part02 VALUES LESS THAN (TO_DATE ('2008-08-1 00:00:00', 'yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs02, PARTITION part03 VALUES LESS THAN (TO_DATE ('2008-09-1 00:00:00', 'yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs03);
(2)、列表分区表
CREATE TABLE list_example (dname VARCHAR2 (10), DATA VARCHAR2 (20)) PARTITION BY LIST (dname) (PARTITION part01 VALUES ('ME', 'PE', 'QC', 'RD'), PARTITION part02 VALUES ('SMT', 'SALE'));
(3)、哈希分区表
CREATE TABLE hash_example ( hash_key_column DATE, DATA VARCHAR2 (20) ) PARTITION BY HASH (hash_key_cloumn) (PARTITION part01, PARTITION part02);
(4)、组合分区表
CREATE TABLE range_hash_example ( range_column_key DATE, hash_column_key INT, DATA VARCHAR2 (20) ) PARTITION BY RANGE (range_column_key) SUBPARTITION BY HASH (hash_column_key) SUBPARTITIONS 2 (PARTITION part_1 VALUES LESS THAN (TO_DATE ('2008-08-01', 'yyyy-mm-dd')) ( SUBPARTITION part_1_sub_1 , SUBPARTITION part_1_sub_2 , SUBPARTITION part_1_sub_3 ), PARTITION part_2 VALUES LESS THAN (TO_DATE ('2008-09-01', 'yyyy-mm-dd')) (SUBPARTITION part_2_sub_1 , SUBPARTITION part_2_sub_2 ));
八、 分区索引的结构图
注:hash partitioned table 新增partition时,现有表的中全部data都有从新计算hash值,而后从新分配到分区中。因此被从新分配的分区的 indexes须要rebuild 。
2、案例 - 建立分区表
案例: 建立分区表bxj_emp,以性别区分数据分区方式,将资料分别存放两个男女表空间中
1. 建立两个表空空间
CREATE TABLESPACE bxj_emp_ts1 LOGGING DATAFILE '/opt/oracle/oradata/gavinsit/bxj_emp_data01.dbf' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL CREATE TABLESPACE bxj_emp_ts2 LOGGING DATAFILE '/opt/oracle/oradata/gavinsit/bxj_emp_data02.dbf' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL
2. 建立分区表,以sex栏位区分
CREATE TABLE bxj_emp_tb ( emp_id NUMBER, employeee_name VARCHAR (50), sex VARCHAR (10), salary NUMBER ) PARTITION BY LIST (sex) (PARTITION bxj_emp_ts1 VALUES ('male'), PARTITION bxj_emp_ts2 VALUES ('female'));
3. 创建测试资料,男女各一笔
insert into apps.bxj_emp_tb values (1, 'gavin.bao', 'male', 100000); insert into apps.bxj_emp_tb values (2, 'gavin.bao', 'female', 200000);
4. 以条件sex = male进行查询时,系统只遍历tablespace 1 male
5. 以条件sex = female进行查询时,系统只遍历tablespace 1 female
6. 无分区条件查询,系统需所有遍历tablespace 1 and 2 / male and female
3、 案例 - 本地分区索引
1. 建立本地分区索引
CREATE INDEX bxj_emp_tb_localindex ON apps.bxj_emp_tb(sex) LOCAL ( PARTITION idx_1 TABLESPACE bxj_emp_ts1, PARTITION idx_2 TABLESPACE bxj_emp_ts2 );
2. 解析计划中索引遍历方式
4、案例 - 全局分区索引
1. 建立全局分区索引
CREATE INDEX bxj_emp_tb_globalindexON bxj_emp_tb (salary) GLOBAL PARTITION BY RANGE ( salary ) ( PARTITION idx_1 VALUES LESS THAN (10000) TABLESPACE bxj_emp_ts1, PARTITION idx_2 VALUES LESS THAN (MAXVALUE) TABLESPACE bxj_emp_ts2 );
2. 条件为salary <= 100, 索引只遍历tablespace1
3. 条件为salary >=100000, 索引只遍历tablespace2
4. 无分区条件时,索引遍历所有
5、案例 - Oracle Erp交易表mtl_material_transactions的结构
select * from dba_tab_subpartitions
where table_name = 'MTL_MATERIAL_TRANSACTIONS'
Thanks and Regards
参考:http://www.linuxidc.com/Linux/2011-08/40763.htm
参考:http://mingyue19850801.blog.163.com/blog/static/19520820201071712231671/