Oracle分区表说明文档Word文档格式.docx
- 文档编号:20607214
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:10
- 大小:20.75KB
Oracle分区表说明文档Word文档格式.docx
《Oracle分区表说明文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《Oracle分区表说明文档Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
List分区(列表分区):
当你需要明确地控制如何将行映射到分区时,就使用列表分区方法。
与范围分区和散列分区所不同,列表分区不支持多列分区。
如果要将表按列分区,那么分区键就只能由表的一个单独的列组成,然而可以用范围分区或散列分区方法进行分区的所有的列,都可以用列表分区方法进行分区。
范围-散列分区(复合分区):
有时候我们需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。
复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法(注意:
先一定要进行范围分区)
范围-列表分区(复合分区):
范围和列表技术的组合,首先对表进行范围分区,然后用列表技术对每个范围分区再次分区。
与组合范围-散列分区不同的是,每个子分区的所有内容表示数据的逻辑子集,由适当的范围和列表分区设置来描述。
(注意:
四、Oracle表分区表操作
--Partitioning是否为true
select*fromv$optionsorderbys.PARAMETERdesc
--创建表空间
CREATETABLESPACE"
PARTION_03"
LOGGING
DATAFILE'
D:
ORACLEORADATAJZHUAPARTION_03.dbf'
SIZE50M
EXTENTMANAGEMENTLOCALSEGMENTSPACEMANAGEMENTAUTO
--删除表空间
droptablespacepartion_01
--范围分区技术语句
createtablePartition_Test
(
PIDnumbernotnull,
PITEMvarchar2(200),
PDATAdatenotnull
)
partitionbyrange(PID)
partitionpart_01valueslessthan(50000)tablespacedinya_space01,
partitionpart_02valueslessthan(100000)tablespacedinya_space02,
partitionpart_03valueslessthan(maxvalue)tablespacedinya_space03
createtablePartition_TTest
partitionbyrange(PDATA)
partitionpart_t01valueslessthan(to_date('
2004-01-01'
'
yyyy-mm-dd'
))tablespacedinya_space01,
partitionpart_t02valueslessthan(to_date('
2008-01-01'
))tablespacedinya_space02,
partitionpart_t03valueslessthan(maxvalue)tablespacedinya_space03
insertintoPartition_Test(PID,PITEM,PDATA)selecth.id,h.userid,h.rectimefromst_handleh
select*fromPartition_Testpartition(part_01)twheret.pid='
1961'
--hash分区技术
createtablePartition_HashTest
partitionbyhash(PID)
partitionpart_h01tablespacedinya_space01,
partitionpart_h02tablespacedinya_space02,
partitionpart_h03tablespacedinya_space03
insertintoPartition_HashTest(PID,PITEM,PDATA)selecth.id,h.userid,h.rectimefromst_handleh
select*fromPartition_HashTestpartition(part_h03)twheret.pid='
--复合分区技术
createtablePartition_FHTest
partitionbyrange(PDATA)subpartitionbyhash(PID)subpartitions3storein(dinya_space01,dinya_space02,dinya_space03)
partitionpart_fh01valueslessthan(to_date('
partitionpart_fh02valueslessthan(to_date('
partitionpart_fh03valueslessthan(maxvalue)tablespacedinya_space03
insertintoPartition_FHTest(PID,PITEM,PDATA)selecth.id,h.userid,h.rectimefromst_handleh
select*fromPartition_FHTestpartition(part_fh02)twheret.pid='
select*fromPartition_FHTestpartition(part_fh03)t
--速度比较
select*fromst_handlehwhereh.rectime>
to_date('
);
select*fromPartition_FHTestpartition(part_fh03)twheret.pdata>
--分区表操作
--增加一个分区
altertablePartition_Testaddpartitionpart_05valueslessthan(10020)tablespacedinya_space03
--查询分区数据
select*fromPartition_FHTestpartition(part_fh02)t
--修改分区里的数据
updatePartition_FHTestpartition(part_fh02)tsett.PITEM='
JZHUA'
wheret.pid='
--删除分区里的数据
deletefromPartition_FHTestpartition(part_fh02)twheret.pid='
--合并分区
createtablePartition_HB
insertintoPartition_HB(PID,PITEM,PDATA)selecth.id,h.userid,h.rectimefromst_handleh
select*fromPartition_HBpartition(part_03)twheret.pid='
100001'
altertablePartition_HBmergepartitionspart_01,part_02intopartitionpart_02;
--拆分分区
--spiltpartition分区名at(这里是一个临界区,比如:
50000就是说小于50000的放在part_01,而大于50000的放在part_02中)
altertablePartition_HBsplitPartitionpart_02at(50000)into(Partitionpart_01tablespacedinya_space01,Partitionpart_02tablespacedinya_space02);
--更改分区名
altertablePartition_HBrenamePartitionpart_01_testtopart_02;
五、Oracle索引分区表操作
分区表和一般表一样可以建立索引,分区表可以创建局部索引和全局索引。
当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引。
全局索引建立时global子句允许指定索引的范围值,这个范围值为索引字段的范围值。
其实理论上有3中分区索引。
索引分区是在您建立了表分区后,要建索引就必须是建立索引分区。
分2大类:
一类是把索引信息建立在各个分区上,这叫局部索引分区(或叫本地索引分区)。
另一类是把索引集中起来,叫全局索引。
Global索引(全局索引):
对于global索引,可以选择是否分区,而且索引的分区可以不与表分区相对应。
当对分区进行维护操作时,通常会导致全局索引的Invalid,必须在执行完操作后Rebuild。
Oracle9i提供了UpdateGlobalIndexes语句,可以在进行分区维护的同时重建全局索引。
1:
索引信息的存放位置与父表的Partition(分区)信息完全不相干。
甚至父表是不是分区表都无所谓的。
createindexdinya_idx_tondinya_test(item_id)globalpartitionbyrange(item_id)(
partitionidx_1valueslessthan(1000)tablespacedinya_space01,
partitionidx_2valueslessthan(10000)tablespacedinya_space02,
partitionidx_3valueslessthan(maxvalue)tablespacedinya_space03
2:
但是在这种情况下,如果父表是分区表,要删除父表的一个分区都必须要更新GlobalIndex,否则索引信息不正确
ALTERTABLETableNameDROPPARTITIONPartitionNameUpdateGlobalIndexes
建立方法:
createindexind_2onsales(amount_sold)
globalpartitionbyrange(amount_sold)
(partitiond1,
partitiond2);
因为全局索引的首个字段必须是range字段,所以就无所谓前缀和非前缀了,都是前缀。
经过试验,我觉得建立全局索引的速度要略逊于局部前缀索引。
也可能是我的能力问题,现在觉得建立分区还不然不建立索引。
如果大家能给我解惑
Local索引(局部索引):
对于local索引,每一个表分区对应一个索引分区(就是说一个分区表一个字段只可以建一个局部索引),当表的分区发生变化时,索引的维护由Oracle自动进行;
索引信息的存放位置依赖于父表的Partition(分区)信息,换句话说创建这样的索引必须保证父表是Partition(分区),索引信息存放在父表的分区所在的表空间。
但是仅可以创建在父表为HashTable或者composite分区表的。
3:
仅可以创建在父表为HashTable或者composite分区表的。
并且指定的分区数目要与父表的分区数目要一致。
createindexdinya_idx_tondinya_test(item_id)local(
partitionidx_1tablespacedinya_space01,
partitionidx_2tablespacedinya_space02,
partitionidx_3tablespacedinya_space03
不指定索引分区名直接对整个表建立索引
createindexdinya_idx_tondinya_test(item_id);
createindexind_1ondept(deptno)
local
(1)局部前缀索引分区和局部非前缀分区。
如果您拟建立的索引的首个字段,和进行分区时的range列一样,那就是局部前缀索引分区。
优点是:
理论上(我认为的),比方说您以年代为range分区,2007年一个分区、2008年一个分区,然后您又在这个时间列上建立了局部前缀索引分区,那么ORACLE就会直接利用这个区上的索引仅进行这个分区上的搜索,所以效率会很高。
在我建立的2000万的表中进行查询,实践是,这个局部前缀复合索引的花销cost是5,而没有分区前是4。
当然这也无所谓了。
又进行了其他几个查询,其cost都相差无几。
(2)局部非前缀索引。
如果您建立索引的列的首个字段不是range列,那么就叫局部非前缀索引。
如果您查一个电话号码,它在每年都会出现,当您要count汇总时,这种索引就会同时把这几个分区进行并行处理查询,速度理论上要快。
但我的试验比较令我失望:
我建了一个2000万的无分区的表,然后把这个表又复制了一遍,进行了6个分区。
但结果在对某列进行查询统计时,如果在一个分区,两者速度相差不大,分区的查询速度是:
0.25m,无分区的查询速度是:
0.065m。
但在我期望的跨区统计时,分区的第一次统计时间是:
61.875m,第二次是:
10m;
而无分区的表仅为:
3.703m。
谈谈怎么实现Oracle数据库分区表
2010-09-0416:
23:
23|
分类:
oracle|
标签:
|字号大中小
订阅
Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法,做手头的项目以前,只聆听过分区的大名,感觉特神秘,看见某某高手在讨论会上夸夸其谈时,真是骂自己学艺不精,最近作GPS方面的项目,处理的数据量达到了几十GB,为了满足系统的实时性要求,必须提高数据的查询效率,这样就必须通过分区,以解燃眉之急!
先说说分区的好处吧!
1)
2)
3)
4)
Oracle数据库提供对表或索引的分区方法有三种:
ü
范围分区
Hash分区(散列分区)
复合分区
一、范围分区详细说明
如根据序号分区,根据时间等来进行分区。
根据序号,比如小于2000000的放在part01,2000000~4000000的放在part02。
。
createtableAAA
idnumberprimarykey,
indatedatenotnull
partitionbyrange(indate)
partitionpart_01valueslessthan(to_date('
2006-01-01'
))tablespacespace01,
partitionpart_02valueslessthan(to_date('
2010-01-01'
))tablespacespace02,
partitionpart_03valueslessthan(maxvalue)tablespacespace03
space01\space02\space03为建立的三个表空间,相当于把建立的一个大的表分在了3个不同的表空间的分区上了。
二、Hash分区(散列分区)详细说明
也就是只命名分区名称,这样均匀进行数据分布。
三、复合分区详细说明
复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法。
partitionbyrange(indate)subpartitionbyhash(id)
subpartitions3storein(space01,space02,space03)
(
partitionpart_01valueslessthan(to_date(’2006-01-01’,’yyyy-mm-dd’)),
partitionpart_02valueslessthan(to_date(’2010-01-01’,’yyyy-mm-dd’)),
partitionpart_03valueslessthan(maxvalue)
四、分区表操作
1、插入记录:
insertintoAAAvalues(1,sysdate);
2、查询分区表记录:
select*fromAAApartition(part_01);
3、更新分区表的记录:
updateAAApartition(part_01)tsetindate=’’whereid=1;
但是当更新的时候指定了分区,而根据查询的记录不在该分区中时,将不会更新数据
4、删除分区表记录:
deletefromAAApartition(part_02)twhereid=4;
如果指定了分区,而条件中的数据又不在该分区中时,将不会删除任何数据。
5、增加一个分区:
altertableAAAaddpartitionpart_04valueslessthan(to_date(’2012-01-01’,’yyyy-mm-dd’))tablespacedinya_space03;
增加一个分区的时候,增加的分区的条件必须大于现有分区的最大值,否则系统将提示ORA-14074partitionboundmustcollatehigherthanthatofthelastpartition错误。
6、合并一个分区:
altertableAAAmergepartitionspart_01,part_02intopartitionpart_02;
如果在合并的时候把合并后的分区定为part_01的时候,系统将提示ORA-14275cannotreuselower-boundpartitionasresultingpartition错误。
7、删除分区:
altertableAAAdroppartitionpart_01;
删除分区表的一个分区后,查询该表的数据时显示,该分区中的数据已全部丢失,所以执行删除分区动作时要慎重,确保先备份数据后再执行,或将分区合并。
五、建立索引
1.
局部索引分区的建立:
createindexidx_tonAAA(id)
local
partitionidx_1tablespacespace01,
partitionidx_2tablespacespace02,
partitionidx_3tablespacespace03
2.
全局索引建立时global子句允许指定索引的范围值,这个范围值为索引字段的范围值:
globalpartitionbyrange(id)
partitionid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 分区表 说明 文档