Oracle 10g分区0708.docx
《Oracle 10g分区0708.docx》由会员分享,可在线阅读,更多相关《Oracle 10g分区0708.docx(31页珍藏版)》请在冰豆网上搜索。
Oracle10g分区0708
Oracle10g分区表维护中的两个注意事项
1.全局索引
SQL>altertableanalyse_contenttruncatesubpartitionDATA0712_DEYANG;
网管论坛bbs.ofAdmin.Com
Tabletruncated
truncate分区后,修改或者插入数据报错:
ORA-01502:
index'phs.pk'orpartitionofsuchindexisinunusablestate
这个时候只能rebuildindex
IT技术网Www.ofAdmin.Com
SQL>alterindexphs.pkrebuild;
Indexaltered
华夏网管Www.ofAdmin.Com
执行以后恢复正常,或者使用如下语句:
IT技术社区bbs.ofAdmin.Com
SQL>altertableanalyse_contenttruncatesubpartitionDATA0712_ZIGONGUPDATE
GLOBALINDEXES;
IT技术社区bbs.ofAdmin.Com
Tabletruncated
网管网ofAdmin.Com
这样它会自动恢复索引。
华夏网管论坛bbs.ofAdmin.Com
2.物化视图网管网ofAdmin.Com
对于已经建有fastrefreshview的分区表来说,truncate和drop分区表会导致物化视图
出错。
IT技术网Www.ofAdmin.Com
SQL>altertableanalyse_contentdropsubpartitionDATA0712_MIANYANG;网管论坛bbs.ofAdmin.Com
Tablealtered
SQL>altertableanalyse_contenttruncatesubpartitionDATA0712_LUZHOU;
网管Www.ofAdmin.Com
Tabletruncated华夏网管Www.ofAdmin.Com
再次查询物化视图,这个两个分区的数据仍然存在,说明物化视图不能对这种DDL语句进行
更新。
网管网ofAdmin.Com尝试在基础表插入数据,报错:
华夏网管ofAdmin.Com
ORA-32313:
REFRESHFASTof""unsupportedafterPMOPs
这时候必须手工刷新MV
网管Www.ofAdmin.Com
SQL>execdbms_mview.refresh('mv_analyse_content','f');华夏网管论坛bbs.ofAdmin.Com
begindbms_mview.refresh('mv_analyse_content','f');end;网管网ofAdmin.Com
ORA-32313:
PMOP之后不支持"PHS"."MV_ANALYSE_CONTENT"的REFRESHFAST华夏网管论坛bbs.ofAdmin.Com
ORA-06512:
在"SYS.DBMS_SNAPSHOT",line2255
华夏网管论坛bbs.ofAdmin.Com
ORA-06512:
在"SYS.DBMS_SNAPSHOT",line2461
网管Www.ofAdmin.Com
ORA-06512:
在"SYS.DBMS_SNAPSHOT",line2430
ORA-06512:
在line1
看来快速刷新'f'是不行,还是得完全刷新'c'
SQL>execdbms_mview.refresh('mv_analyse_content','c');网管网ofAdmin.Com
PL/SQLproceduresuccessfullycompleted
网管论坛bbs.ofAdmin.Com
执行完后,MV里面的数据恢复正常,基表不再报错。
实际10g里面,truncate分区后,某些物化视图可以执行fastrefresh,具体有很多限制,
IT技术社区bbs.ofAdmin.Com
要查询doc,反正select*fromtable这种视图肯定可以'f',不过却没有什么意义。
——20080422在doc上找到了PCT特性的限制,如下:
IT技术网Www.ofAdmin.Com
Atleastoneofthedetailtablesreferencedbythematerializedviewmustbe
partitioned.
华夏网管ofAdmin.Com
Partitionedtablesmustuseeitherrange,listorcompositepartitioning.网管Www.ofAdmin.Com
Thetoplevelpartitionkeymustconsistofonlyasinglecolumn.
网管论坛bbs.ofAdmin.Com
Thematerializedviewmustcontaineitherthepartitionkeycolumnorapartition
markerorROWIDorjoindependentexpressionofthedetailtable.See
网管论坛bbs.ofAdmin.Com
DatabasePL/SQLPackagesandTypesReferencefordetailsregardingtheDBMS_
网管网ofAdmin.Com
MVIEW.PMARKERfunction.网管网ofAdmin.Com
IfyouuseaGROUPBYclause,thepartitionkeycolumnorthepartitionmarkeror
IT技术网Www.ofAdmin.Com
ROWIDorjoindependentexpressionmustbepresentintheGROUPBYclause.网管网ofAdmin.Com
IfyouuseananalyticwindowfunctionortheMODELclause,thepartitionkey
columnorthepartitionmarkerorROWIDorjoindependentexpressionmustbe
华夏网管Www.ofAdmin.Com
presentintheirrespectivePARTITIONBYsubclauses.华夏网管ofAdmin.Com
Datamodificationscanonlyoccuronthepartitionedtable.IfPCTrefreshisbeing网管Www.ofAdmin.Com
doneforatablewhichhasjoindependentexpressioninthematerializedview,
IT技术网Www.ofAdmin.Com
thendatamodificationsshouldnothaveoccurredinanyofthejoindependent
网管论坛bbs.ofAdmin.Com
tables.华夏网管论坛bbs.ofAdmin.Com
TheCOMPATIBILITYinitializationparametermustbeaminimumof9.0.0.0.0.
PCTisnotsupportedforamaterializedviewthatreferstoviews,remotetables,or华夏网管ofAdmin.Com
outerjoins.网管网ofAdmin.Com
PCT-basedrefreshisnotsupportedforUNIONALLmaterializedviews.
对于海量数据库,如果不能使用DROP分区,则delete相当慢。
华夏网管Www.ofAdmin.Com
如果使用了,又会导致完全
刷新MV,同样慢。
华夏网管论坛bbs.ofAdmin.Com
在物化视图的时候要认真考虑PCT特性。
华夏网管Www.ofAdmin.Com
对于分区表已经相关索引,快照的维护,建议还是参考的DOC,在adminguide和
IT技术网Www.ofAdmin.Com
datawarehouseguide里有非常完善描述。
虽然没有涉及internal,但完全可以满足应用。
Oracle数据库10g中的分区功能
Oracle分区功能可以提高许多应用程序的可管理性、性能与可用性。
通过分区功能,可以将表、索引和索引组织表进一步细分为段,从而能够更精确的管理和访问这些数据库对象。
Oracle提供了种类繁多的分区方案以满足每种业务要求。
而且,因为在SQL语句中分区是完全透明的,所以该功能几乎可应用于任何应用程序。
分区功能的优势
分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。
通常,分区可以使某些查询以及维护操作的性能大大提高。
此外,分区还可以极大简化常见的管理任务。
通过分区,数据库设计人员和管理员能够解决前沿应用程序带来的一些难题。
分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区功能的基本知识
分区功能能够将表、索引或索引组织表进一步细分为段。
这些数据库对象的段叫做分区。
每个分区有自己的名称,还可以选择自己的存储特性。
从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理。
这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQLDML命令访问分区后的表时,无需任何修改。
表的分区是通过“分区键”来实现的,分区键指的是一些列,这些列决定了某一行所在的分区。
Oracle数据库10g提供了六项技术用于对表进行分区:
范围分区
每个分区都由一个分区键值范围指定(对于一个以日期列作为分区键的表,“2005年1月”分区包含分区键值为从“2005年1月1日”到“2005年1月31日”的行)。
列表分区
每个分区都由一个分区键值列表指定(对于一个地区列作为分区键的表,“北美”分区可能包含值“加拿大”“美国”和“墨西哥”)。
散列分区
将散列算法用于分区键来确定指定行所在的分区
组合范围-散列分区
范围和散列分区技术的组合,通过该组合,首先对表进行范围分区,然后针对每个单独的范围分区再使用散列分区技术进一步细分。
索引组织表只能进行范围分区。
组合范围-列表分区
范围和列表分区技术的组合,通过该组合,首先对表进行范围分区,然后针对每个单独的范围分区再使用列表分区技术进一步细分。
索引组织表可以按范围、列表或散列进行分区。
Oracle数据库10g还提供了三种类型的分区索引:
本地索引
本地索引是其分区方式与其所在基础表的分区方式一模一样的索引。
本地索引的每个分区仅对应于其所在基础表的一个分区。
全局分区索引
全局分区索引是使用不同于其所在表的分区键进行分区的索引,其所在表可以是分区表或非分区表。
全局分区的索引可以使用范围或散列分区进行分区。
例如,某个表可以按月份进行范围分区,因此具有十二个分区,而该表上的索引则可以使用不同的分区键进行范围分区,从而具有不同的分区数量。
全局非分区索引
全局非分区索引基本上和非分区表的索引一样。
索引结构是不分区的。
Oracle提供了一系列丰富的技术,可用于对表、索引和索引组织表进行分区,因此可以针对任何业务环境中的任何应用程序进行最佳的分区Oracle还提供一套完整的SQL命令,用于管理分区表。
其中包括添加新分区、删除分区、分拆分区以及合并分区的命令。
用分区功能提高可管理性
通过Oracle分区功能,可将表和索引分成更多、更小的可管理单元,从而使数据库管理员能以“化整为零,个个击破”的方式管理数据。
使用分区功能,维护操作可集中于表的特定部分。
例如,数据库管理员可以只对表的一部分做备份,而不必对整个表做备份。
对整个数据库对象的维护操作,可以在每个分区的基础上进行,从而将维护工作分解成更容易管理的小块。
利用分区功能提高可管理性的一个典型用法是支持数据仓库中的‘滚动视窗’加载进程。
假设数据库管理员每周向表中加载新数据。
可以对该表进行范围分区,使每个分区包含一周的数据。
这样加载进程只是简单地添加新的分区。
添加一个分区的操作比修改整个表效率高很多,因为DBA不需要修改任何其他分区。
用分区功能提高性能
由于限制了所检查或操作的数据数量,同时支持并行任务执行,Oracle分区功能实现了性能上增益。
这些特性包括:
分区修整
分区修整是用分区功能提高性能的最简单最有价值的手段。
分区修整常常能够将查询性能提高几个数量级。
例如,假设某个应用程序包含一个存储订单历史记录的Orders表,并且此表已按周分区。
查询一周的订单只需访问该订单表的一个分区。
如果该订单表包含两年的历史记录,这个查询只需要访问一个分区而不是一百零四个。
该查询的执行速度因为分区修整而有可能快一百倍。
分区修整能与所有其他Oracle性能特性协作。
Oracle能将分区修整功能与任何索引技术、联接技术或并行访问方法结合使用。
分区智能联接
分区功能可以通过称为分区智能联接的技术提高多表联接的性能。
当两个表要联接在一起,而且每个表都用联接键来分区时,就可以使用分区智能联接。
分区智能联接将大型联接分解成较小的发生在各个分区间的联接,从而用较少的时间完成全部联接。
这就给串行和并行的执行都能带来显著的性能改善。
用分区功能提高可用性
分区的数据库对象具有分区独立性。
该分区独立性特点可能是高可用性战略的一个重要部分,例如,如果分区表的一个分区不能用,但该表的所有其他分区仍然保持在线并可用。
那么这个应用可以继续针对该分区表执行查询和事务处理,只要不是访问不可用的分区,数据库操作仍然能够成功运行。
数据库管理员可以指定各分区存放在不同的表空间里,从而让管理员隔离其它表分区针对单个分区进行备份与恢复操作。
还有,分区功能可以减少计划停机时间。
由于分区功能改善了性能,使数据库管理员能用相对较少的时间完成大型数据库对象的维护工作。
未来发展方向
自从引入分区技术以来,Oracle公司在每次推出重要版本时都会增加新的分区方法。
Oracle8引入了范围分区功能,Oracle8i引入了散列和组合范围散列分区功能,Oracle9i引入了列表分区功能。
在最新版本Oracle数据库10g中,则增强了用于索引组织表和全局分区索引的分区策略,并且扩展了其用于所有分区维护操作的并发索引维护功能。
Oracle公司致力于不断完善分区技术,确保满足所有的业务需求。
结论
具有Oracle分区功能的Oracle数据库10g可以显著增强几乎任何数据库应用程序的可管理性、性能和可用性。
分区功能可用于前沿应用程序,分区功能确实能够成为保障这些应用程序成功的关键技术成分。
同时,分区功能也可用于较为普通的数据库应用,来简化这些应用的管理工作,降低管理成本。
Oracle数据库分区表操作技术
摘要:
在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。
在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。
虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。
使用分区的优点:
·增强可用性:
如果表的某个分区出现故障,表在其他分区的数据仍然可用;
·维护方便:
如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
·均衡I/O:
可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;
·改善查询性能:
对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
Oracle数据库提供对表或索引的分区方法有三种:
·范围分区
·Hash分区(散列分区)
·复合分区
下面将以实例的方式分别对这三种分区方法来说明分区表的使用。
为了测试方便,我们先建三个表空间。
以下为引用的内容:
createtablespacedinya_space01
datafile'/test/demo/oracle/demodata/dinya01.dnf'size50M;
createtablespacedinya_space01
datafile'/test/demo/oracle/demodata/dinya02.dnf'size50M;
createtablespacedinya_space01
datafile'/test/demo/oracle/demodata/dinya03.dnf'size50M;
1.1.分区表的创建
1.1.1.范围分区
范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。
如根据序号分区,根据业务记录的创建日期进行分区等。
需求描述:
有一个物料交易表,表名:
material_transactions。
该表将来可能有千万级的数据记录数。
要求在建该表的时候使用分区表。
这时候我们可以使用序号分区三个区,每个区中预计存储三千万的数据,也可以使用日期分区,如每五年的数据存储在一个分区上。
根据交易记录的序号分区建表:
以下为引用的内容:
SQL>createtabledinya_test
2(
3transaction_idnumberprimarykey,
4item_idnumber(8)notnull,
5item_descriptionvarchar2(300),
6transaction_datedatenotnull
7)
8partitionbyrange(transaction_id)
9(
10partitionpart_01valueslessthan(30000000)tablespacedinya_space01,
11partitionpart_02valueslessthan(60000000)tablespacedinya_space02,
12partitionpart_03valueslessthan(maxvalue)tablespacedinya_space03
13);
Tablecreated.
建表成功,根据交易的序号,交易ID在三千万以下的记录将存储在第一个表空间dinya_space01中,分区名为:
par_01,在三千万到六千万之间的记录存储在第二个表空间:
dinya_space02中,分区名为:
par_02,而交易ID在六千万以上的记录存储在第三个表空间dinya_space03中,分区名为par_03.
根据交易日期分区建表:
以下为引用的内容:
SQL>createtabledinya_test
2(
3transaction_idnumberprimarykey,
4item_idnumber(8)notnull,
5item_descriptionvarchar2(300),
6transaction_datedatenotnull
7)
8partitionbyrange(transaction_date)
9(
10partitionpart_01valueslessthan(to_date(’2006-01-01’,’yyyy-mm-dd’))
tablespacedinya_space01,
11partitionpart_02valueslessthan(to_date(’2010-01-01’,’yyyy-mm-dd’))
tablespacedinya_space02,
12partitionpart_03valueslessthan(maxvalue)tablespacedinya_space03
13);
Tablecreated.
这样我们就分别建了以交易序号和交易日期来分区的分区表。
每次插入数据的时候,系统将根据指定的字段的值来自动将记录存储到制定的分区(表空间)中。
当然,我们还可以根据需求,使用两个字段的范围分布来分区,如partitionbyrange(transaction_id,transaction_date),分区条件中的值也做相应的改变,请读者自行测试。
1.1.2.Hash分区(散列分区)
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
如将物料交易表的数据根据交易ID散列地存放在指定的三个表空间中:
以下为引用的内容:
SQL>createtabledinya_test
2(
3transaction_idnumberprimarykey,
4item_idnumber(8)notnull,
5item_descriptionvarchar2(300),
6transaction_datedate
7)
8partitionbyhash(transaction_id)
9(
10partitionpart_01tablespacedinya_space01,
11partitionpart_02tablespacedinya_space02,
12partitionpart_03tab