Oracle分区的5W+H

前段时间使用oracle分区功能并参考了一篇英文文档,现在与大家分享一下,有些是直接翻译的,英文水平不高,见笑!

Oracle分区的5W+H

说明:

5W:what,why,whern,who,where

H:how

 

分区使得表和索引或者索引表再细分成更小的易管理的片,将这些细分的每个小片称为分区”.应用程序设计的观点看,分区表与非分区表是没有区别的,如果应用程序开始对一个非分区表进行写操作,它没有必要去访问一个分区表.

 

Oracle8.0版本中引进了分区功能,并支持关键字范围分区,稍后再详细介绍.随后oracle8i中的”Hash和复合分区oracle9i中的列表分区”,并与其他一些特点被相继引进.其中任何一种分区方法都有其优点和缺点,根据数据和应用程序的类型来决定采用那种分区方式,同时也可以修改,重命名,移动,添加,删除,截取,拆分分区.现在就来详细说明.

表中使用分区的优点

 

1.     更小,更多易管理的数据片(分区)

2.     减少恢复时间

3.     减小失败影响

4.     能够在分区级别实现import / export功能

5.     快速访问数据

6.     分区间的独立工作

7.     使用非常简单

 

分区方法类型

 

1.     范围分区

此分区类型基于列范围值创建分区,主要通过限制分区范围来定义每个分区,”范围分区一般情况下采用的值是数据表中的时间字段.假设存在一个SAMPLE_ORDERS数据表,并带有ORDER_DATE字段,并假设该表存在5年的历史记录.接下来可以依据假设的时间和方面(依据实际因素设定)来创建分区.

这样每个方面的数据都成为SAMPLE_ORDER表的一个分区.第一个分区将是最低限度的,最后一个将是最高限度的.据此,如果我们查询1999范围的数据,就可以直接查询第一个分区(实际划分的1999)

以下语法实现了范围分区的创建

 

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER)
PARTITION BY RANGE(ORDER_DATE)
(
PARTITION SO99Q1 VALUES LESS THAN TO_DATE(‘01-APR-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q2 VALUES LESS THAN TO_DATE(‘01-JUL-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q3 VALUES LESS THAN TO_DATE(‘01-OCT-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q1 VALUES LESS THAN TO_DATE(‘01-APR-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2001’, ‘DD-MON-YYYY’)
)
;


上述例子主要创建了8个基于SAMPLE_ORDERS表的分区,所有分区都对应一个方面,分区SO99Q1只包含1999方面的orders数据.

 

2.     Hash 分区(散列分区)

 

该分区类型下的表记录根据用于分区的hash’列值进行分区.”Hash”分区与范围分区相比没有任何逻辑意义.列举一例.

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
ORDER_ZIP_CODE)
PARTITION BY HASH (ORDER_ZIP_CODE)
(PARTITION P1_ZIP TABLESPACE TS01, 
PARTITION P2_ZIP TABLESPACE TS02,
PARTITION P3_ZIP TABLESPACE TS03, 
PARTITION P4_ZIP TABLESPACE TS04)
ENABLE ROW MOVEMENT;


上述例子依据能表示orders存放位置的zip代码列创建了4hash分区.

 

3.     列表分区(仅存在9i)

 

使用该分区类型的表记录根据表中的一列值创建分区,假设存在像政府’,’亚洲’,’雇员’,’美洲’,’欧洲这样类别的数据表,把这些类别定义为分区的关键字,就可以创建一个独立的列表分区或者一个类别组分区,例如,’ American-partition’包含所有类似‘American’分区的记录.

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
SHIP_TO_ZIP_CODE,
SHIP_TO_STATE)
PARTITION BY LIST (SHIP_TO_STATE)
(PARTITION SHIP_TO_ARIZONA VALUES (‘AZ’) TABLESPACE TS01, 
PARTITION SHIP_TO_CALIFORNIA VALUES (‘CA’) TABLESPACE TS02, 
PARTITION SHIP_TO_ILLINOIS VALUES (‘IL’) TABLESPACE TS03, 
PARTITION SHIP_TO_MASACHUSETTES VALUES (‘MA’) TABLESPACE TS04, 
PARTITION SHIP_TO_MICHIGAN VALUES (‘MI’) TABLESPACE TS05)
ENABLE ROW MOVEMENT;

上述例子创建了一组基于SHIP_TO_STATE的列表分区,并为每个分区指定了不同的表空间.

 

4.Range-Hash 复合分区

这是一种范围与哈希的合成分区方式,由此看来,首先将数据进行范围分区,然后利用哈希关键值对数据进一步进行哈希分区.所有的子分区都对应数据的一个逻辑子集.

再次修改上面的例子:

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
CUST_NAME VARCAHR2, 
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
SHIP_TO_ZIP_CODE,
SHIP_TO_STATE)
TABLESPACE USERS
PARTITION BY RANGE (ORDER_DATE) 
SUBPARTITION BY HASH(CUST_NAME) 
SUBPARTITION TEMPLATE(
(SUBPARTITION SHIP_TO_ARIZONA VALUES (‘AZ’) TABLESPACE TS01, 
SUBPARTITION SHIP_TO_CALIFORNIA VALUES (‘CA’) TABLESPACE TS02, 
SUBPARTITION SHIP_TO_ILLINOIS VALUES (‘IL’) TABLESPACE TS03, 
SUBPARTITION SHIP_TO_NORTHEAST VALUES (‘MA’, ‘NY’, ‘NJ’) TABLESPACE TS04, 
SUBPARTITION SHIP_TO_MICHIGAN VALUES (‘MI’) TABLESPACE TS05)
(
PARTITION SO99Q1 VALUES LESS THAN TO_DATE(‘01-APR-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q2 VALUES LESS THAN TO_DATE(‘01-JUL-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q3 VALUES LESS THAN TO_DATE(‘01-OCT-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q1 VALUES LESS THAN TO_DATE(‘01-APR-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2001’, ‘DD-MON-YYYY’)
)
ENABLE ROW MOVEMENT;


上面的例子说明每个范围分区都被列表分区又分成的更小的分区. SHIP_TO_ARIZONA是一个基于AZ列表值的子分区.这个分区又用于表示SO99Q1范围主分区等等.

5.Range-List 复合分区(仅存在9i)

也可以说是一种合成分区,首先将数据进行范围分区,然后在根据列表关键值对这些范围分区进一步做列表分区,每个子分区都单独表示数据的一个逻辑子集,它不同于Range-Hash分区.

由索引组成的表可以使用Range或者Hash进行分区.

再次修改上面的分区.

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
CUST_NAME VARCAHR2, 
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
SHIP_TO_ZIP_CODE,
SHIP_TO_STATE)
TABLESPACE USERS
PARTITION BY RANGE (ORDER_DATE) 
SUBPARTITION BY LIST(SHIP_TO_STATE) 
SUBPARTITION TEMPLATE(
SUBPARTITION SP1 TABLESPACE TS01,
SUBPARTITION SP2 TABLESPACE TS02,
SUBPARTITION SP3 TABLESPACE TS03,
SUBPARTITION SP4 TABLESPACE TS04,
SUBPARTITION SP5 TABLESPACE TS05)
(
PARTITION SO99Q1 VALUES LESS THAN TO_DATE(‘01-APR-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q2 VALUES LESS THAN TO_DATE(‘01-JUL-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q3 VALUES LESS THAN TO_DATE(‘01-OCT-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q1 VALUES LESS THAN TO_DATE(‘01-APR-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2001’, ‘DD-MON-YYYY’)
)
ENABLE ROW MOVEMENT;


oracle9i,还可以分区上创建索引.如下:

a.     本地索引

本地索引是在分区表中存在的相同方式的索引.每个本地索引分区只对应一个分区.

b.全局分区索引

在分区表或非分区表上都能够创建全局分区索引,但现在我们只能使用范围分区” ,例如上面将表分成标识一个方面(“Global Index”)的例子中,可以被使用不同的分区关键字和分区号码创建一个全局索引.

c.全局非分区索引

全局非分区索引与非分区表上的普通索引没有区别.它的结构并没有被分区.



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值