data partition 介绍

1.1 Partition 的种类

Ø Data partitioning 的好处

1) 对数据的维护可以在partition 的层次

2) 提高查询效率

3) 可以提高数据仓库的可用性,比如,一个磁盘里的数据坏了,另一个可以接着用

Ø 什么时候使用Partition Data

1) 大表(2GB)时考虑使用partition

2) 用来做为partition的字段,像numbericdatecharacter都可以;long Lob字段不可以

3) 所有的表和索引的partition逻辑上的属性相同,像字段和约束,但是物理上的属性就不同,像所存在的表空间

1.1.1 Range Partition

通过partition key值的范围,以确定数据放入相应的partition

CREATE TABLE easydw.purchases

(product_id varchar2(8),

time_key date,

customer_id varchar2(10),

purchase_date date,

purchase_time number(4,0),

purchase_price number(6,2),

shipping_charge number(5,2),

today_special_offer varchar2(1))

PARTITION by RANGE (time_key)

(partition purchases_jan2003

values less than (TO_DATE('01-FEB-2003', 'DD-MON-YYYY'))

tablespace purchases_jan2003,

partition purchases_feb2003

values less than (TO_DATE('01-MAR-2003', 'DD-MON-YYYY'))

tablespace purchases_feb2003,

partition purchases_mar2003

values less than (TO_DATE('01-APR-2003', 'DD-MON-YYYY'))

tablespace purchases_mar2003,

partition purchase_catchall

values less than (MAXVALUE)

tablespace purchases_maxvalue);

注意:purchase_catchall是将所有不符合的范围的数据放到这个区内

1.1.2 Hash Partitioning

通过range partition 可能会造成partition的分布不均,一些特别大,一些很小

通过Hash Partitioning实现了partition的均匀分布

CREATE TABLE easydw.purchases

(product_id varchar2(8),

time_key date,

customer_id varchar2(10),

purchase_date date,

purchase_time number(4,0),

purchase_price number(6,2),

shipping_charge number(5,2),

today_special_offer varchar2(1))

PARTITION BY HASH(product_id)

PARTITIONS 4;

注意:相同的product_id在一个partiton里,我们不能控制哪类产品放入哪个partition里,但可以设置partition的数量。

1.1.3 List Partition

有些情况下,数据没有像时间那样的字段去分割数据,根据离散的数据进行分割,就是List partition

CREATE TABLE easydw.regional_sales

(state varchar2(2),

store_number number,

dept_number number,

dept_name varchar2(10),

sales_amount number (6,2)

)

PARTITION BY LIST(state)

(

PARTITION northeast VALUES (‘NH’, ‘VT’, ‘MA’, ‘RI’, ‘CT’),

PARTITION southeast VALUES (‘NC’, ‘GA’, ‘FL’),

PARTITION northwest VALUES (‘WA’, ‘OR’),

PARTITION midwest VALUES (‘IL’, ‘WI’, ‘OH’),

PARTITION west VALUES (‘CA’, ‘NV’, ‘AZ’),

PARTITION otherstates VALUES (DEFAULT));

注意: partition otherstates 存储所有不符合的数据,查询通过partition key可以优化,例如: 如果访问NHVT 只用查询Partiton northeast 就可以了。

1.1.4 Composite Partition

在组合partition里,数据先由一个partition 方式分割,然后再由另外一个Partition方式对前一个分割好的partition继续分割。

有两种方式:

Ø RangeHash

Ø RangeList

1.1.4.1 RangeHash Partition

Range 会造成数据的分布不均,而hash不能控制数据的分布,两种方式的结合可以集成两种方式的优点。数据先有range分割,然后有hash的方式继续子分割。

CREATE TABLE easydw.purchases

(product_id varchar2(8),

time_key date,

customer_id varchar2(10),

purchase_date date,

purchase_time number(4,0),

purchase_price number(6,2),

shipping_charge number(5,2),

today_special_offer varchar2(1))

PARTITION by RANGE (time_key)

SUBPARTITION BY HASH(product_id)

SUBPARTITIONS 4

(partition purchases_jan2003

values less than (TO_DATE('01-FEB-2003', 'DD-MON-YYYY'))

STORE IN (purchases_jan2003_1,

purchases_jan2003_2,

purchases_jan2003_3,

purchases_jan2003_4),

partition purchases_feb2003

values less than (TO_DATE('01-MAR-2003', 'DD-MON-YYYY'))

STORE IN (purchases_feb2003_1,

purchases_feb2003_2,

purchases_feb2003_3,

purchases_feb2003_4),

partition purchases_mar2003

values less than (TO_DATE('01-APR-2003', 'DD-MON-YYYY'))

STORE IN (purchases_mar2003_1,

purchases_mar2003_2,

purchases_mar2003_3,

purchases_mar2003_4));

1.1.4.2 Range—List Partition

这种方式先由连续的值像time 对表进行分割,然后用离散的值像state 做进一步的分割。

CREATE TABLE sales

(state varchar2(2),

store_number number,

dept_number number,

dept_name varchar2(10),

sales_amount number (6,2),

sale_date date,

item_number number (10)

)

PARTITION BY RANGE (sale_date)

SUBPARTITION BY LIST(state)

SUBPARTITION TEMPLATE

(

SUBPARTITION "NorthEast"

VALUES ('NH', 'VT', 'MA', 'RI', 'CT')

TABLESPACE sales_ne,

SUBPARTITION "SouthEast"

VALUES ('NC', 'GA', 'FL')

TABLESPACE sales_se,

SUBPARTITION "NorthWest"

VALUES ('WA', 'OR')

TABLESPACE sales_nw,

SUBPARTITION "MidWest"

VALUES ('IL', 'WI', 'OH')

TABLESPACE sales_mw,

SUBPARTITION "West"

VALUES ('CA', 'NV', 'AZ')

TABLESPACE sales_w

)

(

PARTITION sales_jan_2003

VALUES LESS THAN (TO_DATE('01-FEB-2003', 'DD-MON-YYYY')),

PARTITION sales_feb_2003

VALUES LESS THAN (TO_DATE('01-MAR-2003', 'DD-MON-YYYY')),

PARTITION sales_mar_2003

VALUES LESS THAN (TO_DATE('01-APR-2003', 'DD-MON-YYYY'))

);

注意:本例种由subpartition template。这样oracle就会用partition的名称+template定义的名称=Subpartiton 的名称。

查看partition的语句

SELECT partition_name, subpartition_name

FROM user_tab_subpartitions

WHERE table_name = 'SALES';

1.1.4.3 Multicolumn Partition Keys

用于rangehash partitionkey可以有多个字段组成,最多可达16个字段。

CREATE TABLE easydw.purchases

(product_id varchar2(8),

time_key date,

customer_id varchar2(10),

purchase_date date,

purchase_time number(4,0),

purchase_price number(6,2),

shipping_charge number(5,2),

today_special_offer varchar2(1))

PARTITION by RANGE (time_key, product_id)

(

partition purchases_jan2003_100

values less than (TO_DATE('31-JAN-2003','DD-MON-YYYY'), 100)

tablespace purchases_jan2003_100,

partition purchases_jan2003_200

values less than (TO_DATE('31-JAN-2003','DD-MON-YYYY'), 200)

tablespace purchases_jan2003_200 ,

partition purchases_feb2003_all

values less than (TO_DATE('28-FEB-2003','DD-MON-YYYY'), 100)

tablespace purchases_feb2003,

partition purchases_mar2003_all

values less than (TO_DATE('31-MAR-2003','DD-MON-YYYY'), 100)

tablespace purchases_mar2003

);

1.1.5 选择Partition的方式

当表里有像时间这样的连续字段可以使用Range;当通过离散值分割表时用List;通常去出表中的热点问题,就有hash partition 或者Range结合使用;Rangelist当多维的数据的情况下使用。

注意:partition key不能频繁更新,影响效率。

[@more@]

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

转载于:http://blog.itpub.net/7724693/viewspace-981889/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值