Oracle 分区表总结.docx
《Oracle 分区表总结.docx》由会员分享,可在线阅读,更多相关《Oracle 分区表总结.docx(36页珍藏版)》请在冰豆网上搜索。
Oracle分区表总结
一.分区表理论知识
Oracle提供了分区技术以支持VLDB(VeryLargeDataBase)。
分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。
分区完全对应用透明。
Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。
查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。
WhentoPartitionaTable什么时候需要分区表,官网的2个建议如下:
(1)Tablesgreaterthan2GBshouldalwaysbeconsideredforpartitioning.
(2)Tablescontaininghistoricaldata,inwhichnewdataisaddedintothenewestpartition.Atypicalexampleisahistoricaltablewhereonlythecurrentmonth'sdataisupdatableandtheother11monthsarereadonly.
翻译:
(1)表大于2GB应始终被视为分区。
(2),其中包含历史数据的表,新的数据加入到最新的分区。
一个典型的例子是一个历史的只有当前月份的数据更新和其他11个月内是只读的表。
在oracle10g中最多支持:
1024k-1个分区:
Tablescanbepartitionedintoupto1024K-1separatepartitions
翻译:
表可以分成高达1024K-1单独的分区
联机文档上有关分区表和索引的说明:
PartitionedTablesandIndexes
分区提供以下优点:
(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;
(2)可以对单独的分区进行备份和恢复;
(3)可以将分区映射到不同的物理磁盘上,来分散IO;
(4)提高可管理性、可用性和性能。
Oracle10g提供了以下几种分区类型:
(1)范围分区(range);
(2)哈希分区(hash);
(3)列表分区(list);
(4)范围-哈希复合分区(range-hash);
(5)范围-列表复合分区(range-list)。
Range分区:
Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。
如按照时间划分,2010年1月的数据放到a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。
在按时间分区时,如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中。
如:
createtablepdba(idnumber,timedate)partitionbyrange(time)
(
partitionp1valueslessthan(to_date('2010-10-1','yyyy-mm-dd')),
partitionp2valueslessthan(to_date('2010-11-1','yyyy-mm-dd')),
partitionp3valueslessthan(to_date('2010-12-1','yyyy-mm-dd')),
partitionp4valueslessthan(maxvalue)
)
Hash分区:
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。
hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。
如:
createtabletest
(
transaction_idnumberprimarykey,
item_idnumber(8)notnull
)
partitionbyhash(transaction_id)
(
partitionpart_01tablespacetablespace01,
partitionpart_02tablespacetablespace02,
partitionpart_03tablespacetablespace03
);
在这里,我们指定了每个分区的表空间。
List分区:
List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。
在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。
在根据某字段,如城市代码分区时,可以指定default,把非分区规则的数据,全部放到这个default分区。
如:
createtablecustaddr
(
id varchar2(15byte) notnull,
areacode varchar2(4byte)
)
partitionbylist(areacode)
( partitiont_list025values('025'),
partitiont_list372values('372'),
partitiont_list510values('510'),
partitionp_othervalues(default)
)
组合分区:
如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。
组合分区呢在10g中有两种:
range-hash,range-list。
注意顺序,根分区只能是range分区,子分区可以是hash分区或list分区。
如:
createtabletest
(
transaction_idnumberprimarykey,
transaction_datedate
)
partitionbyrange(transaction_date)subpartitionbyhash(transaction_id)
subpartitions3storein(tablespace01,tablespace02,tablespace03)
(
partitionpart_01valueslessthan(to_date(’2009-01-01’,’yyyy-mm-dd’)),
partitionpart_02valueslessthan(to_date(’2010-01-01’,’yyyy-mm-dd’)),
partitionpart_03valueslessthan(maxvalue)
);
createtableemp_sub_template(deptnonumber,empnamevarchar(32),gradenumber)
partitionbyrange(deptno)subpartitionbyhash(empname)
subpartitiontemplate
(subpartitionatablespacets1,
subpartitionbtablespacets2,
subpartitionctablespacets3,
subpartitiondtablespacets4
)
(partitionp1valueslessthan(1000),
partitionp2valueslessthan(2000),
partitionp3valueslessthan(maxvalue)
);
createtablequarterly_regional_sales
(deptnonumber,item_novarchar2(20),
txn_datedate,txn_amountnumber,statevarchar2
(2))
tablespacets4
partitionbyrange(txn_date)
subpartitionbylist(state)
(partitionq1_1999valueslessthan(to_date('1-apr-1999','dd-mon-yyyy'))
(subpartitionq1_1999_northwestvalues('or','wa'),
subpartitionq1_1999_southwestvalues('az','ut','nm'),
subpartitionq1_1999_northeastvalues('ny','vm','nj'),
subpartitionq1_1999_southeastvalues('fl','ga'),
subpartitionq1_1999_northcentralvalues('sd','wi'),
subpartitionq1_1999_southcentralvalues('ok','tx')
),
partitionq2_1999valueslessthan(to_date('1-jul-1999','dd-mon-yyyy'))
(subpartitionq2_1999_northwestvalues('or','wa'),
subpartitionq2_1999_southwestvalues('az','ut','nm'),
subpartitionq2_1999_northeastvalues('ny','vm','nj'),
subpartitionq2_1999_southeastvalues('fl','ga'),
subpartitionq2_1999_northcentralvalues('sd','wi'),
subpartitionq2_1999_southcentralvalues('ok','tx')
),
partitionq3_1999valueslessthan(to_date('1-oct-1999','dd-mon-yyyy'))
(subpartitionq3_1999_northwestvalues('or','wa'),
subpar