ITPub博客

首页 > 数据库 > Oracle > 各种分区类型详解(带图)和索引分区

各种分区类型详解(带图)和索引分区

原创 Oracle 作者:flysky0814 时间:2007-12-03 11:10:26 0 删除 编辑

范围分区

CREATE TABLE sales_range 
(salesman_id  NUMBER(5), 
salesman_name VARCHAR2(30), 
sales_amount  NUMBER(10), 
sales_date    DATE)
PARTITION BY RANGE(sales_date) 
(
PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','MM/DD/YYYY')),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','MM/DD/YYYY')),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','MM/DD/YYYY')),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','MM/DD/YYYY'))
);

列表分区:

CREATE TABLE sales_list
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois'),
PARTITION sales_other VALUES(DEFAULT)
);

HASH分区:

CREATE TABLE sales_hash
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 4
STORE IN (ts1, ts2, ts3, ts4);

注:在HASH分区时,ORACLE官方规定最好分区个数为偶数,否则性能极差,具体原因是什么,偶也不知,算法的黑幕吧,嘿嘿~

range-hash复合分区:

语法例一:

CREATE TABLE sales_composite
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY RANGE(sales_date)
SUBPARTITION BY HASH(salesman_id)
SUBPARTITION TEMPLATE(
SUBPARTITION sp1 TABLESPACE ts1,
SUBPARTITION sp2 TABLESPACE ts2,
SUBPARTITION sp3 TABLESPACE ts3,
SUBPARTITION sp4 TABLESPACE ts4)
(PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','MM/DD/YYYY'))
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','MM/DD/YYYY'))
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','MM/DD/YYYY'))
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','MM/DD/YYYY'))
PARTITION sales_may2000 VALUES LESS THAN(TO_DATE('06/01/2000','MM/DD/YYYY'))

注:SUBPARTITION TEMPLATE中指定了每一个子分区的存放tablespace,而父分区则没有指定.其存放规则如下:

sales_jan2000分区中的sp1子分区放于ts1,

sales_jan2000分区中的sp2子分区放于ts2,

sales_feb2000分区中的sp1子分区放于ts1,

sales_feb2000分区中的sp2子分区放于ts2,

存储细节如下图所示:

语法例二:

create table gw_mt_log(
FEE_TERMINAL_ID NUMBER(20),
SEND_TIME DATE )
partition by range(SEND_TIME)
subpartition by hash(FEE_TERMINAL_ID)
subpartitions 10 store in
(ts_mt_060101_phone_00,
ts_mt_060101_phone_01,
ts_mt_060101_phone_02,
ts_mt_060101_phone_03,
ts_mt_060101_phone_04,
ts_mt_060101_phone_05,
ts_mt_060101_phone_06,
ts_mt_060101_phone_07,
ts_mt_060101_phone_08,
ts_mt_060101_phone_09)
(
partition gw_send_time_060101 values less than(to_date('2006-01-01','yyyy-mm-dd')) TABLESPACE ts_mt_060101,
partition gw_send_time_060201 values less than(to_date('2006-02-01','yyyy-mm-dd')) TABLESPACE ts_mt_060201,
partition gw_send_time_060301 values less than(to_date('2006-03-01','yyyy-mm-dd')) TABLESPACE ts_mt_060301,
partition gw_send_time_0***01 values less than(to_date('2006-04-01','yyyy-mm-dd')) TABLESPACE ts_mt_0***01,
partition gw_send_time_060501 values less than(to_date('2006-05-01','yyyy-mm-dd')) TABLESPACE ts_mt_060501,
partition gw_send_time_060601 values less than(to_date('2006-06-01','yyyy-mm-dd')) TABLESPACE ts_mt_060601,
partition gw_send_time_060701 values less than(to_date('2006-07-01','yyyy-mm-dd')) TABLESPACE ts_mt_060701,
partition gw_send_time_060801 values less than(to_date('2006-08-01','yyyy-mm-dd')) TABLESPACE ts_mt_060801,
partition gw_send_time_060901 values less than(to_date('2006-09-01','yyyy-mm-dd')) TABLESPACE ts_mt_060901,
partition gw_send_time_061001 values less than(to_date('2006-10-01','yyyy-mm-dd')) TABLESPACE ts_mt_061001,
partition gw_send_time_061101 values less than(to_date('2006-11-01','yyyy-mm-dd')) TABLESPACE ts_mt_061101,
partition gw_send_time_061201 values less than(to_date('2006-12-01','yyyy-mm-dd')) TABLESPACE ts_mt_061201,
partition gw_send_time_070101 values less than(to_date('2007-01-01','yyyy-mm-dd')) TABLESPACE ts_mt_070101,
partition gw_send_time_070201 values less than(to_date('2007-02-01','yyyy-mm-dd')) TABLESPACE ts_mt_070201,
partition gw_send_time_070301 values less than(to_date('2007-03-01','yyyy-mm-dd')) TABLESPACE ts_mt_070301,
partition gw_send_time_070401 values less than(to_date('2007-04-01','yyyy-mm-dd')) TABLESPACE ts_mt_070401,
partition gw_send_time_070501 values less than(to_date('2007-05-01','yyyy-mm-dd')) TABLESPACE ts_mt_070501,
partition gw_send_time_070601 values less than(to_date('2007-06-01','yyyy-mm-dd')) TABLESPACE ts_mt_070601,
partition gw_send_time_070701 values less than(to_date('2007-07-01','yyyy-mm-dd')) TABLESPACE ts_mt_070701,
partition gw_send_time_070801 values less than(to_date('2007-08-01','yyyy-mm-dd')) TABLESPACE ts_mt_070801,
partition gw_send_time_max values less than(maxvalue) TABLESPACE gw_send_time_max
);

在此种分区类型中ts_mt_060101_phone_00为逻辑上的一个分区,物理上和其它subpartition没有分开存储.

range-list复合分区:

CREATE TABLE bimonthly_regional_sales
(deptno NUMBER, 
 item_no VARCHAR2(20),
 txn_date DATE, 
 txn_amount NUMBER, 
 state VARCHAR2(2))
PARTITION BY RANGE (txn_date)
SUBPARTITION BY LIST (state)
SUBPARTITION TEMPLATE(
SUBPARTITION east VALUES('NY', 'VA', 'FL') TABLESPACE ts1,
SUBPARTITION west VALUES('CA', 'OR', 'HI') TABLESPACE ts2,
SUBPARTITION central VALUES('IL', 'TX', 'MO') TABLESPACE ts3)
(
PARTITION janfeb_2000 VALUES LESS THAN (TO_DATE('1-MAR-2000','DD-MON-YYYY')),
PARTITION marapr_2000 VALUES LESS THAN (TO_DATE('1-MAY-2000','DD-MON-YYYY')),
PARTITION mayjun_2000 VALUES LESS THAN (TO_DATE('1-JUL-2000','DD-MON-YYYY'))
);
其物理存储规则也象rang-hash全区.
本地分区索引组织结构:

本地分区索引是其分区方式与其所在基础表的分区方式一模一样的索引。本地索引的每个分区仅对应于其所在基础表的一个分区

本地分区索引组织结构:
全局分区索引组织结构:(即索引的分区)
全局分区索引是使用不同于其所在表的分区键进行分区的索引,其所在表可以是分区表或非分区表。全局分区的索引可以使用范围或散列分区进行分区。例如,某个表可以按月份进行范围分区,因此具有十二个分区,而该表上的索引则可以使用不同的分区键进行范围分区,从而具有不同的分区数量。 
全局分区索引组织结构:
全局(非分区)索引组织结构:
全局非分区索引基本上和非分区表的索引一样。索引结构是不分区的。
全局(非分区)索引组织结构:
分区索引的其它属性(未实验):
1.索引的分区创建语法
create index idx_cdr on lbmp_cdr_tab(end_time)  global partition by range(end_time)  (partition p01_idx vlaues less than (‘0106’))

2.
使用LOCAL分区索引的话就可以建在表上,在新增分区的时候Oracle会自动在分区上加载LOCAL索引的.
CREATE INDEX idx_cdr ON lbmp_cdr_tab(end_time) 
LOCAL TABLESPACE lbmp_cdr_tabs
STORAGE( INITIAL 512K NEXT 512K MAXEXTENTS UNLIMITED PCTINCREASE 0);
分区属性修改的其它常用操作语法:
修改分区索引的默认表空间
alter index index_name modify default attribute for partition partitionname tablespace tablespacename
重建分区索引:
alter index PL_LRMXFY_FYID rebuild partition LRMXFY200511 tablespace LRMXFY200511
 
重建子分区索引:
ALTER INDEX idx_mytable REBUILD SUBPARTITION subpartition_name tablespace tablespacename;
查询分区索引的情况:
select index_name, partition_name, tablespace from user_ind_partitions
查询子分区索引的情况:
select index_name, partition_name, subpartition_name from user_ind_subpartitions
最后再来总结一下分区的理论应用:(摘录的,哈哈)
利用分区功能提高可管理性的一个典型用法是支持数据仓库中的滚动视窗加载进程。
假设数据库管理员每周向表中加载新数据。可以对该表进行范围分区,使每个分区包含一周的数据。
这样加载进程只是简单地添加新的分区。添加一个分区的操作比修改整个表效率高很多,
因为 DBA 不需要修改任何其他分区。 
用分区功能提高性能   由于限制了所检查或操作的数据数量,同时支持并行任务执行,
Oracle 分区功能实现了性能上增益。   分区修整   分区修整是用分区功能提高性能的最简单最有价值的手段。
分区修整常常能够将查询性能提高几个数量级。
例如,假设某个应用程序包含一个存储订单历史记录的 Orders 表,
并且此表已按周分区。查询一周的订单只需访问该订单表的一个分区。
如果该订单表包含两年的历史记录,这个查询只需要访问一个分区而不
是一百零四个。该查询的执行速度因为分区修整而有可能快一百倍。
分区修整能与所有其他 Oracle 性能特性协作。
Oracle 能将分区修整功能与任何索引技术、联接技术或并行访问方法结合使用。 分区智能联接   分区功能可以通过称为分区智能联接的技术提高多表联接的性能。
当两个表要联接在一起,而且每个表都用联接键来分区时,
就可以使用分区智能联接。分区智能联接将大型联接分解
成较小的发生在各个分区间的联接,从而用较少的时间完成
全部联接。这就给串行和并行的执行都能带来显著的性能改善。 用分区功能提高可用性   分区的数据库对象具有分区独立性。该分区独立性特点可能
是高可用性战略的一个重要部分,例如,如果分区表的一个分区
不能用,但该表的所有其他分区仍然保持在线并可用。那么这个
应用可以继续针对该分区表执行查询和事务处理,只要不是访问
不可用的分区,数据库操作仍然能够成功运行。   数据库管理员可以指定各分区存放在不同的表空间里,从而
让管理员隔离其它表分区针对单个分区进行备份与恢复操作。
还有,分区功能可以减少计划停机时间。由于分区功能改善了
性能,使数据库管理员能用相对较少的时间完成大型数据库对
象的维护工作。
[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11423276/viewspace-987633/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-03-31

  • 博文量
    53
  • 访问量
    381963