Oracle分区表(partitionedtable)管理分区表和索引一、什么是分区表现在的数据库,单个表的数据量可能很大,达到几百个G和几T的程度,这时侯,你需要使用分区表和分区索引来管理数据,它将一个大的多分为块,称为分区(patitions),甚至子分区(subpartition)。每一个分区都保存在自已的段中,可以单独的管理。分区可以结合并行执行和合理的数据分布来提高系统的可用性和性能。●减少数据中断的可能性●可以单独备份或恢复每一个分区●控制分区的分布(平衡I/O负荷)●提高可管理性,可用性和性能二、表分区的方法1.range使用表的字段的值的范围来进行分区,它特别适用于数据有逻辑范围的表。如一年中的月。当数据在范围内均匀分布时性能最好。createtablesalse(invoice_nonumber,saleyearintnotnull,salemonthintnotnull,sale_dayintnotnull)partionbyrange(saleyea,sale_month,sale_day)(partitionsale_q1valuelessthan(1999,04,01)tablespacetsapartitionsale_q2valuelessthan(2000,04,01)tablespacetsbpartitionsale_q2valuelessthan(maxvalue)tablespacetsc);--最大值maxvalue可以指定enablerowmovement来设置当分区列的值被修改时,将行移动到不同的分区。2.hash当数据不容易使用range分区,但你又需要使用分区来提高性能和可管理性,hash分区方法,根据分区值(partitioningkey)的hash值来确定分区。createtablescubagear(idnumber,namevarchar2(60))partitionbyhash(id)partitions4storein(gear1,gear2,gear3,gear4);3.list当你需要控制行怎么映射至分区时,使用list分区方法,你可以将分区列的值指定到分区中。createtableq1_sale_by_region(dept_nonumber,dept_namevarchar2(20),quarterly_salesnumber(10,2),statevarchar2(2))partitionbylist(state)(partitionq1_northwestvalue('OR','WA'),(partitionq1_southwestvalue('AZ','UT'));可以用值DEFAULT来指定除已经明确指定的值以外其他的值,NULL来指定空值。4.rang-hashcreatetablescubagear(equipnonumber,equipnamevarchar(32),pricenumber)partitionbyrange(equipno)subpartitionbyhash(equipname)subpartition8storein(ts1,ts2,ts3,ts4)---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---(partitionp1valueslessthan(1000),partitionp1valueslessthan(2000),partitionp1valueslessthan(3000));5.rang-listcreatetablequarterly_regional_sales(deptnonumber,item_novarchar2(20),txn_datedate,txn_amountnumber,statevarchar2(2))tablespacets4partitionbyrange(txn_date)(partitionq1_1999valuelessthan(to_date('19990401','yyyymmdd'))(subpartitionq1_1999_northwestvalues('OR','WA')subpartitionq1_1999_southwestvalues('AZ','UT')),(partitionq2_2000valuelessthan(to_date('20000401','yyyymmdd'))(subpartitionq1_1999_northwestvalues('OR','WA')subpartitionq1_1999_southwestvalues('AZ','UT')));6.子分区模版当使用range-hash或rang-list分区方式时,如果子分区一致,则可以设置子分区模版来简化建表语句:createtableemp_sub_template(deptnonumber,empnamevarchar2(32),gradenumber)partitionbyrange(deptno)subpartitionbyhash(empname)subpartitiontemplate(subpartitionatablespacets1,subpartitionbtablespacets2)(partitionp1valuelessthan(1000),partitionp2valuelessthan(2000),partitionp3valuelessthan(MAXVALUE));三、修改分区表1.增加分区i.在range-partitioned表中增加分区range-partitioned表只能在最后(即partitionkey大于现存的最大值)增加分区,如果要在中间或开始,则必须使用splitpartitionaltertablesalesaddpartitionjan96valueslessthan(’01-FEB-1999’)tablespacetsx;ii.在hash-partitioned表中增加分区altertablescubagearaddpartitionp_namedtablespacegear5;当使用这个方式增加分区后,oracle将对现存数据重新分区,同时本地索引增加一个新分区,行被重新分区的索引分区标识为unusable,需要重建,全局分区设置为unusable需要重建。...