Oracle分区技术(精选5篇)
Oracle分区技术 第1篇
Oracle分区技术在1997年的Oracle 8.0中首次引入, 它是Oracle数据库最重要、最成功的功能之一, 可以提高数以万计的应用程序的性能、可管理性和可用性。Oracle数据库11g引入了第8代分区, 继续提供突破性的新增强功能。新的分区技术使客户能够针对更多的业务案例进行建模, 为更多的业务需求提供最佳分区技术。
2.分区的概念
分区技术能够将表、索引或按索引组织的表进一步细分为小块。这些数据库对象的小块称为分区。每个分区都有自己的名称, 还可以选择自己的存储特性。这样带来一系列好处:
1.增强可用性:如果表的某个分区出现故障, 表在其他分区的数据仍然可用。
2. 维护方便:如果表的某个分区出现故障, 需要修复数据, 只修复该分区即可。
3. 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O, 改善整个系统性能。
4.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区, 提高检索速度。
从数据库管理员的角度来看, 分区后的对象具有多个小块, 这些小块既可以集中管理, 也可以单独管理。这就使管理员在管理分区后的对象时具有相当大的灵活性。
从应用程序的开发人员角度来看, 分区后的表与未分区的表完全相同, 在使用SQL DML语句访问分区后的表时, 无需任何修改。
3. 分区策略
Oracle提供了三种基本数据分配方法:范围 (range) 、列表 (list) 与散列 (hash) 。使用上述数据分配方法, 可以将表分成单一表或组合分区表。用户可以根据实际业务需要以最佳方式调整数据细分。
3.1 单一分区
通过指定其中一个数据分配方法来定义表, 并使用一个或多个列作为分区键。例如, 某个表使用数字列作为分区键, 并具有两个分区"less_than_five_hundred"和less_than_thousand", "less_than_thousand"分区包含符合以下条件的行:500<=分区键<1000。
3.2 组合分区
使用两个数据分配方法的组合来定义组合分区表。首先, 使用一个数据分配方法将表分区, 然后使用第二个数据分配方法为每个分区进一步划分子分区。给定分区的所有子分区一起代表数据的逻辑子集。例如, 首先对范围-散列组合分区表进行范围分区, 然后使用散列分区技术为每个单独的范围分区进一步划分子分区。
所提供的组合分区技术包括范围-散列、范围-列表、范围-范围、列表-范围、列表-列表和列表-散列。
4. 分区扩展
除了基本分区策略以外, Oracle 11g中还提供了分区扩展, 包括间隔分区、引用分区与基于虚拟列的分区。分区扩展显著增强分区表的可管理性, 扩展分区键定义的灵活性。
4.1 间隔分区
间隔分区扩展了范围分区的功能, 可以使用间隔定义来定义同类分区范围。当分区的数据首次插入时, Oracle将根据需要自动创建分区, 而非显式指定单独的范围。间隔分区可以大大提高分区表的可管理性。例如, 可以定义一个间隔分区表, 以便Oracle为日历年的每个月份创建一个新分区;随后, 当"Sep2007"的第一条记录插入数据库时, 就会为该月份自动创建一个分区。
可用于间隔分区表的技术包括间隔、间隔-列表、间隔-散列和间隔-范围。
4.2 引用分区
Oracle数据库11g允许利用现有的父子关系对表进行分区。子表可以继承父表的分区策略, 而无需在子表中存储父表的分区键列。在没有引用分区的情况下, 如果您想要利用相同的分区策略, 就必须将父表的所有分区键列复制到子表。此外, 引用分区还允许您根据逻辑数据模型自然地对表进行分区, 而无需存储分区键列, 从而减少了非规范化的手动开销并节省了空间。引用分区还可以透明地继承所有分区维护操作, 从而将表的逻辑形式从父表更改为子表。此外, 引用分区还可以为父表和子表的同类分区自动进行分区智能联接, 从而提高该操作的性能。
例如, 父表ORDERS根据ORDER_DATE列进行了范围分区;其子表ORDER ITEMS没有包含ORDER_DATE列, 但可以根据对ORDERS表的引用进行分区。如果ORDERS表按月份分区, 则"Jan-2007"订单的所有订单项将存储在ORDER ITEMS表的单个分区中, 该表与父表ORDERS具有相同类型的分区。如果将"Feb-2007"分区添加到ORDERS表, Oracle将透明地将同类分区添加到ORDER ITEMS表。
所有基本分区策略都可用于引用分区。
4.3 基于虚拟列的分区
在以前的Oracle版本中, 只有当分区键以物理方式存在于表中, 才可以对表进行分区。虚拟列是Oracle数据库11g中的一个新功能, 该功能移除了这个限制, 并允许使用表达式定义分区键, 以便使用表的一个或多个现有列, 并将表达式仅作为元数据存储。
分区已经得到增强, 以允许在虚拟列上定义分区策略, 从而实现更全面地满足业务需求。您通常会看到信息过载的列;例如, 一个10位的帐户ID可以在前三位中包含帐户分支信息。利用基于虚拟列的分区扩展, 可以通过虚拟 (派生) 列AC-COUNT_BRANCH来扩展包含ACCOUNT_ID列的ACCOUNTS表, ACCOUNT_BRANCH列派生自ACCOUNT_ID列 (该表的分区键) 的前三位。
基于虚拟列的分区支持所有基本分区策略。
5. 索引分区
索引可以与基础表的基本分区策略耦合, 也可以不与之耦合, 包括局部索引、全局分区索引与全局非分区索引。应该根据业务需求选择相应的索引分区策略, 从而实现最合适的分区, 以支持任何类型的应用程序。
5.1 局部索引
局部索引是针对分区表的索引, 该索引可以与基本分区表耦合, 并"继承"该表的分区策略。因此, 局部索引的每个分区仅对应于基础表的一个分区。耦合可实现优化的分区维护;例如, 在删除表分区之后, Oracle只需删除相应的索引分区。不需要进行代价高昂的索引维护。局部索引在数据仓库环境中是最常见的。
5.2 全部分区索引
全局分区索引是使用不同于其所在表的分区键或分区策略进行分区的索引, 其所在表可以是分区表, 也可以是非分区表。全局分区索引可以使用范围分区或散列分区进行分区, 还可以解除与基础表的耦合。例如, 某个表可以按月份进行范围分区, 因此具有12个分区, 而该表上的索引则可以使用不同的分区键进行范围分区, 从而具有不同的分区数量。全局分区索引在OLTP中比在数据仓库环境中更为常见。
5.3 全局非分区索引
全局非分区索引实质上与非分区表的索引一样。索引结构未分区并且未与基础表耦合。在数据仓库环境中, 全局非分区索引的最常见用法是实现主键约束。另一方面, OLTP环境在很大程度上依赖于全局非分区索引。
6. 利用分区进行信息生命周期管理
利用Oracle分区, 可以最好地解决当今面临的以尽可能低的成本存储大量数据的挑战。单个分区的独立性是解决"分层存档"策略联机部分的关键点。特别是在包含历史数据的表中, 数据的重要性 (以及访问模式) 在很大程度上依赖于数据的年龄;分区使您能够将单个分区 (或分区组合) 存储在不同的存储层, 从而提供不同的物理属性和价值点。例如, 一个包含2年数据的Orders表可以仅将最近一个季度的数据存储在昂贵的高端存储层上, 并将表的其余数据 (绝大多数的数据) 存放在廉价的低成本存储层上。通过Oracle分区, 可以大大降低存储成本, 并且不会影响最终用户访问, 从而最佳化存储信息的拥有成本。
7. 总结
Oracle分区可以大大增强几乎所有数据库应用程序的可管理性、性能和可用性。分区可用于前沿应用程序, 并且是确保这些应用程序成功的关键技术因素。对于较为普通的数据库应用程序, 以便简化这些应用程序的管理工作, 并降低管理成本。而且, 分区对应用程序是透明的, 因此可以轻松实现, 因为这不需要进行高成本且耗时的应用程序更改
参考文献
[1].Thomas Kyte, 《Oracle 9i&10g编程艺术》, 人民邮电出版社, 2007.7
Oracle数据库灾备技术探讨 第2篇
技术的讨沦
技术一:Oraclc DataGuard
Oracle Data Guard提供了一种数据同步技术来实现Oracle的高可用性、增强的性能以及自动的故障转移方案。Oracle Data Guard为主数据库创建和维护多个备用数据库,主数据库的改变能够自动将信息从主数据库传送到备用数据库,并保证在此过程中没有信息的丢失。Oracle DataGuard实现方式(见图1)
在Oracle Data Guard的实现中,将一个运行在ARCHIVELOG模式下的数据库指定为服务于应用程序的主数据库,可以通过Oracle Net(Oracle网络)访问一个或多个备用数据庠来提供故障的转移功能。Data Guard自动将重做信息传送到应用此信息的备用数据库,因此,备用数据库在事物处理上可以保持一致,以实现对数据库的保护。
Data Guard有两种类型的备用数据库:物理备用和逻辑备用数据库。
物理备用数据库具有与主数据库相同的结构。逻辑备用数据库具有不同的内部结构(例如用于报表的额外索引)。通过将重做数据转换为依据备用数据库执行的SQL语句,可以同步逻辑备用数据库和主数据。物理和逻辑备份数据库服务于不同的目的。物理备用数据库是一种对主数据库的逐块的复制,因此它可以用作代替主数据库的数据库备份。在灾难恢复过程中,物理备份数据库看起来就像是它替代的主数据库。逻辑备用数据库支持额外的数据库结构,可以更为容易的支持特定的报表需求。因此许多方案将物理数据库用于灾难恢复,然后添加额外的逻辑备用数据库来支持特定的报表和业务需求。
无论物理备用数据库还是逻辑备用数据库,Data Guard通过提取归档日志文件中相关信息。对备用数据库进行数据操作的重做,以实现主、备数据库的同步。
对于物理备用数据库米讲,它接收到的redo record是按图2的方式:
redo apply维持一个standby database是通过精确的物理块来进行主数据库的备份。RFS(远程服务器进程)进程从主数槲库接收到redo record,并将其写入备用数据库的redo log(后面将被简称为SRL)。redo apply通过介质恢复服务将SRL中的redo record读入内存中,介质恢复协调器(MRPO)管理恢复session,并分析redo映射到不同的apply进程。不同的apply进程读取映射的数据块,并将其写入相应改变的数据块。redo apply会自动设置与cpu数日相等的apply进程。
对于逻辑备用数据库来讲,它接收到的redo record是按下图3的方式:
SQL apply使用的是逻辑standby进程进行协调应用相应的redo log中的改变。SQL apply进程读取SRL,井通过LSP(Logical StandbyProcess)将其转化为逻辑的记录改变,并建立SQL事务,并应用这些SQL到standby DB上。
可以看出Data Guard的两种类型备用数据库,虽然都是通过归档口志来实现主数据库和备用数据库的数据一致性,但是过程却不相同:一个是通过物理磁盘的方式,一个是通过重新生成SQL事物来完成数据同步。
技术二:Oracle GoldenGate
GoldenGate是一种基于日志的结构化数据复制技术,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。GoldenGate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据的实时复制(大概5秒以内的延迟),从而可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾等多个场景下应用。
Oracle GoldenGate技术捕捉源数据库日志文件中记录的对象操作信息,并传递到目的数据库,通过对有关数据库对象执行相关的操作,实现目的数据库与源数据库的同步。在获取数据库变化的机制上,Oracle GoldenGate与Data Guard有相似之处,都是通过捕捉日志文件中相关的信息实现的,但Data Guard是把归档日志文件传递到备用数据库,然后由目的数据库(备用数据库)完成重做操作。GoldenGate则是使用源数据库的捕捉进程,通过捕捉进程完成在线日志或归档日志的分析过滤,形成Trail文件。然后将Trail文件通过加密传送到目标地,然后解析成SQL语句导入目标数据库中。
GoldenGate技术中的目的数据库可以是一对一的关系.一对多的关系。也可以是多对一的关系,甚至是多对多关系。源队列与目的队列间信息的传递路径可以是多层的,信息可以经过中间数据库后再被转发至目的数据库。
由于GoldenGate是通过分析过滤日志来捕捉变化,GoldenGate可以实现跨平台的数据库复制以及非Oracle数据库的数据同步。
技术三:CDP方式
CDP(Continue DataProtection持续数据保护)是一项新兴的技术,也是目前最热门的数据保护技术之一。行业内通常的定义为:持续数据保护是一套方法,它可以捕获或跟踪数据的变化,并将其在生产数据之外独立存放,以确保数据可以恢复到过去的任意时间点。持续数据保护系统可以基于块、文件或应用实现,可以为恢复对象提供足够细的恢复粒度,实现几乎无限多的恢复时间点(见图5)。
目前市场上主流的CDP产品通过在操作系统核心层中植入文件过滤驱动程序,来实时捕获所有文件访问操作。对于需要CDP连续备份保护的文件,当CDP管理模块经由文件过滤驱动拦截到其改写操作时,则预先将文件数据变化部分连同当前的系统时间戳(System Time Stamp)一起自动备份到UnaCDP存储体。从
理论上说,任何一次的文件数据变化都会被自动记录,因而称之为持续数据保护。
由于Oracle数据库对读写一致性的特殊性要求,CDP厂商通常是通过调用Oracle9.2后提供的快照技术,能够在数据库正常运行的同时生成某一个时间点的一致性的镜像(注意一定是一致性镜像),Oracle数据库支持在这个一致性镜像基础上通过recoverdatabase,达到一致性的恢复。
技术比较
通过对这三种技术的介绍,不难看出,这三种技术都实现了数据库的灾难备份,但各有特点,存在以下几方面的不同。
基本原理
Oracle Data Guard是通过Oracle数据库归档日志来实现的,并且通过Oracle Net来传输日志;Oracle GoldenGate是通过对归档日志的捕捉并分析其的变化来实现的,有自己独享的传输方式;CDP技术是通过数据库镜像来来变现数据同步,数据库镜像的归档以及传送策略是通过CDP软件来完成。Oracle DataGuard无论是物理备州或者逻辑备用都最多只能使数据库处在同时读的状态,不能实现同时读写,只能实现主机和备机的单活状态;Oracle GoldenGate由于其实现方式,两端数据库都处在双活状态,备份端可以提供实时的数据查询及报表业务等,从而提高系统整体的业务处理能力,充分利用备份端的计算能力,提升系统整体业务处理性能。可以实现两端数据的同时写入。CDP由于是操作系统及实现数据同步,因此不能实现数据库的双活,两个数据库的状态只能实现单活的状态。
切换的时效性
Data Guard在主备切换时需要改变数据库的状态才能使备用数据库达到可读写状态,Oracle GoldenGate在情况发生时,可以立即实现服务器的切换。CDP需要改变整个系统的状态才能将备用系统达到可用。
对异构数具库的支持
Data Guard通过物理和逻辑的方式在备用机上还原数据库的日志,因此不支持异构数据库,也不支持异构的操作系统;GoldenGate通过分析主数据库的日志来完成tail文件,因此支持异构数据库,也支持异构的操作系统。CDP是通过操作系统层面完成数据同步的,因此不支持异构数据库,更不支持异构的操作系统。
系统资源的占用
Data Guard在完成数剧同步过程中需要占用数据库的一部份资源比如LGWR、ARCN和Net manger进程或服务等,对数据库有较大的影响,使数据库性能下降。GoldenGate和CDP是动态监控方式,对资源的消耗样相对较少。
支持Oracle的归档方式
Data
Guard和GoldenGate都是通过日志来实现数据库的数据同步,因此必须要求Oracle数剧库处在归档状态。而CDP因为其的实现方式,就没有这样的需求。
结语
Oracle分区技术 第3篇
Oracle从版本8.0开始引入分区技术,提供了一种在物理上将大数据库对象分解为多个小的、易管理个体的机制。分区技术使得那些看起来令人畏缩、难以实施的海量数据操作变得简易和更富于控制性。分区通过将大的数据表或者索引分割为可以独立管理和并行处理的小对象,为大型数据库数据管理和应用访问提供重要的性能优化和高可用性。本文分析了分区机制的内部原理,主要探讨分区优化技术在性能和可用性方面为应用系统提供的支持。
1 分区概念和机制
1.1 表分区模式
在Oracle数据库中,对数据库表有范围分区、哈希分区、列表分区等模式。具体使用中,要根据应用的不同需求和类别,选择合适的分区模式。
(1)范围分区
此分区方式按某种分类原则,将同一范围内的数据物理存放在同一区域。这种分区方式是最常用的一种表数据分区模式,当数据在逻辑上被特定值分散开来时,通常选择范围分区是比较理想的。
选择被用于进行分区的表列称为分区键,当对已存储的数据行更改分区键所在列的数据时,会有两种情况发生:
(1)当该更新操作没有引起数据移至另一分区时,此更新操作被支持,更新后的行仍然保留存储在原分区中。
(2)当更新操作引起数据移至另一分区时,如果该表的行迁移属性打开,则该操作被支持,否则不支持该操作。需要明确的是,即使表的行迁移属性被打开,这种引起数据跨分区移动的更新操作会导致所影响的数据行ROWID发生变化。
(2)哈希分区
有一个哈希函数作用于表的某个单独列或者一组列上,不同的行数据根据哈希函数计算获取的数值被分配至相应的分区中。哈希分区是一种比较高效的分区模式,但是其应用场景要受数据分布特点等因素的制约。为了获取数据整体上更好地分布,通常建议哈希分区的分区数为2的整数倍,并且尽可能选择高基数的列或者列组作为哈希分区键。
(3)列表分区
列表分区是9i以后出现的新特性。可以基于一系列离散的数值对表的行数据进行分区。对于一些具有代码的数据进行此种方式的分区是合适的,如基于省市代码的人口数据等。
(4)组合分区
组合分区既可以是范围分区和哈希分区的组合,也可以是范围分区和列表分区的组合。也就是说范围分区始终处于组合分区的顶层,其底层可以是哈希分区或者列表分区。
1.2 索引分区模式
与表类似,索引同样可以被分区。索引分区有两种模式。
(1)等价表分区索引
此种索引分区模式生成的分区通常被称为本地索引或者局部索引。对特定的表分区,可以对应有索引分区,这种分区只索引表中特定分区的数据,故称为本地索引。见图1。
(2)范围分区索引
这种索引分区模式生成的分区也被称为全局索引。这种模式下,索引可以被范围分区,一个特定的索引分区中的条目可能会指向任何一个表分区。见图2。
全局索引模式下,索引的分区数和基表上的分区数可能是不一致的。全局索引只能被范围分区,因此如果想创建哈希索引分区或者组合索引分区,只能选择使用本地索引,因为本地索引会使用与其潜在基表相同的分区模式。
2 分区优化技术
2.1 分区优化技术
分区优化技术主要包括分区消除、滑动窗口式数据管理及并行操作。
(1)分区消除
分区是独立实体的特质决定了其在实现数据高可用性方面具有先天的优势。一旦实施了分区,Oracle优化器在产生执行计划时,会自觉去除那些与查询无关的分区,这种行为被称为分区消除。如果一个大表里某一个数据分区被破坏了(该分区数据文件损坏或者离线),此时进行查询,若查询内容并未涉及该分区数据,那么Oracle将会避免该分区的使用,从而成功处理该查询。在具体的工程实践中,本人曾经使用绑定变量的方式执行分区查询操作,结果发现Oracle一样能够很好地应用分区消除特性,这说明Oracle不是在查询分析阶段确定应用待查数据所在分区的。必须要说明的是,只有将分区键作为查询条件进行查询时,分区消除才能更好地工作,这也是由分区的基本原理所决定的。
(2)滑动窗口式数据管理
滑动窗口式数据管理是一种降低数据管理负担的经典方法,其思想主要基于这样一个事实:在相对较小的对象上执行操作固有的简易、快速和更少的资源争用。如在很多数据应用环境下,可能要求保留最近的N段数据。使用分区模式,需进行如下操作:
(1)装载新的单位(月或者年)数据到一个独立的单表中;
(2)在该单表中创建索引;
(3)将该单表数据加载(滑动)至分区表的一端;
(4)从分区表的另一端将最老的数据移出(滑动)。
(3)并行操作
能有效提升查询和数据库DML操作的性能是使用分区的重要原因。DML操作性能提升主要是因为可以在表的分区中实现并行操作。执行并行DML操作时,Oracle同时使用较多的线程或者进程去完成用户的Insert、Delete和Update操作。一个表进行DML操作的最大并行数通常就是它的分区数。并行操作通常被应用在用户较少,机器硬件性能较强的决策支持系统中,对于多用户小事务频繁操作的联机事务处理系统,并行操作是要被避免的,因为这会占用大量的资源,影响系统对其他用户的响应。
在查询性能提升方面,分区主要提供了两种方式:分区消除和并行扫描。利用分区消除特性,在执行复杂查询时,多数分区数据都不会被使用,如果很好利用分区键条件,会直接定位到相关分区中,查询速度能获得提升。并行扫描主要指索引分区特性,索引也能被分区的特点给并行扫描提供了可能,从而查询速度也可以获得提升。
2.2 分区优化技术的探讨
索引是数据库在应用优化层面提供的核心机制,分区索引分为本地索引和全局索引,其实现机制和应用场景各不相同。
(1)本地索引
本地索引是分区表中常用的索引类型。Oracle将本地索引分为两种:本地前缀索引和本地非前缀索引。当分区键是本地索引定义的前导列时,该索引称为本地前缀索引;分区键不是本地索引定义的前导列,此类索引称为本地非前缀索引。两种类型的本地索引都能利用分区消除特性,如果分区键都在索引定义中,那么两类索引都支持惟一性约束。当应用查询条件中包含本地前缀索引时,索引分区消除总是可以被利用。
(2)全局索引
全局索引的分区模式不同于其基表分区模式,表可能会基于字段A被划为10个范围分区,但可以基于字段B构建5个索引范围分区。与本地索引不同,全局索引只有一种即全局前缀索引。Oracle不支持索引分区键非索引前导列的全局索引。全局分区索引能为主键施加惟一性约束,因此可以在创建全局分区索引时施加惟一约束而不必在该索引定义中带上表的分区键。本人查询数据字典发现索引名和主键名确实不一样,并且与主键对应的索引名并非系统产生。
3 应用实例
3.1 应用背景
在某工程项目中,需要记录大量的实时数据到数据库中,该类数据主要是动态目标的实时移动信息,目标一般以开始时间和目标号来惟一标识,而目标的移动信息则由时间和基于该时间点的坐标来进行标识。目标本身的描述信息和目标的运动信息是一种基于目标号的主从实体关系。
目标描述表主要字段:惟一标识、目标号、起始时间、结束时间、属性、历史标志。
目标运动表主要字段:惟一标识、目标号、时间、经度、纬度、速度、高度。
应用需要提供功能查询指定时间段内当前目标的所有坐标信息、指定时间段内特定当前目标的所有坐标信息、指定时间段内已消失目标的所有坐标信息以及按其他条件进行的目标信息查询。
为方便起见将目标信息表称为M表,目标运动表称为N表。经过统计分析得知M表的平均行长度为142字节,N表的平均行长度为48字节,以一天的目标信息量计算,M表将产生142*20000*24字节约为65兆字节,N表将产生48*24*60*60*2*20000字节约为154.495吉字节的数据量,考虑成年累月的运行,产生的数据量相当惊人。当数据量达到一定程度时不论执行应用查询还是进行数据管理(备份/恢复),倘若使用常规的堆表存储,效率低下到可以使功能基本不可用。
3.2 设计思路
分析M和N表数据特征,数据分布基本以时间为线索展开,考虑数据量产生速度,决定以月为单位进行分区设计。针对M表,由于应用查询中多使用范围查询,并且起始时间往往在查询中置前,为了能构建本地前缀索引,选择起始时间作为分区键对M表进行范围分区。而N表则以时间字段作为分区键进行范围分区。对每一个分区都构建单独的分区表空间,这是出于高可用性和并行写的考虑。见图3。
分析应用数据环境,对数据的频繁读写和快速查询是联机事务处理的明显特征,但对历史数据的批量导入导出则是决策支持系统常用的操作,在进行具体设计时,需要取两者的一个平衡点。根据应用需求,构建以下索引:
(1)M表上创建本地索引强加的主键惟一性约束(PK_M),索引列包括起始时间和目标号,用以保证数据惟一性要求,之所以采用包含分区键(起始时间)的本地索引是为了高可用性和维护方便考虑;
(2)M表上创建本地前缀索引(IND_M),索引列包含起始时间和结束时间,可以满足应用基于时间的范围查询,能充分利用分区消除特性,高效完成查询;
(3)M表上创建全局索引(IND_GM),索引列包含历史标志,满足应用对当前和历史目标信息的查询需求(谓词中含有历史标志),由于历史标志仅是取值为两种可能(0或1)的超低基数列,因而即使分区操作引起全局索引失效,重建的过程也是相对较快的,这是为满足查询速度不得不做出的妥协;
(4)N表上创建本地索引强加的主键惟一约束(PK_N),索引列包括时间和目标号。
3.3 效果分析
图4是实际工程中应用常用的一种查询截图,该查询获取某时间段内的目标信息,使用了IND_M本地前缀索引,在0.71秒的时间内获取了64000条记录,发生了765次逻辑读操作,当时数据量是2000万条左右。考虑到分区和合适索引应用之前同样场景的查询需要耗时近半小时之久,性能的提升还是比较明显的。需要说明的是图中椭圆标识的部分,虽然Oracle优化器在选择执行计划时是值得信赖的,但由于实际工程中往往缺少数据库维护工作,表或者索引的统计信息经常没有搜集,因而加上了提示,告诉优化器任何情况下该条查询都要走M表的IND_M索引。
可用性方面,倘若某个分区的表空间崩溃(如4月份表空间文件损坏),但如果查询3月份数据,那么在查询时可以运用分区消除特性,会成功完成应用查询。而对于损坏的表空间而言,需要恢复的数据量仅仅为当月的数据量,恢复时间上可以得到保证。
4 总结
Oracle根据应用类型的不同对表级对象提供了范围分区、哈希分区、列表分区和组合分区,对索引级对象提供了全局索引和本地索引。本文简述了这些分区类型,详细讨论了分区优化技术及分区索引的特点,并通过具体工程项目中的应用,从可用性、维护性和性能优化方面阐述了分区的优点,对其他工程项目中类似的应用场景提供了一种可能的解决方案。
参考文献
[1]Thomas Kyte著,钟鸣,郝玉洁等译.Oracle高效设计[M].北京:机械工业出版社.2006.
[2]Thomas Kyte著,袁勤勇,张玉魁等译.Oracle专家高级编程[M].北京:清华大学出版社.2002.
[3]Geoff Ingram.High-Performance Oracle[M].Indianapolis,Indiana:Wiley Publishing,Inc.2002.
Oracle分区技术 第4篇
1 Oracle的分区功能
1.1 分区的定义
分区就是将一个表或索引物理地分解为多个更小、更可管理的部分。就访问数据库的应用而言, 逻辑上讲只有一个表或一个索引, 但在物理上这个表或索引可能由数十个物理分区组成。每个分区都是一个独立的对象, 可以独自处理, 也可以作为一个更大对象的一部分进行处理[2]。
1.2 采用分区技术管理数据的特点
分区有利于管理非常大的表和索引, 它使用了一种“分而治之”的逻辑。分区引入了一种分区键 (partition key) 的概念, 分区键用于根据某个区间值 (或范围值) 、特定值列表或散列函数值执行数据的聚集。采用分区管理海量数据的好处如下: (1) 改善查询性能:利用表分区技术将一个大表水平分区成若干小的分区。 查询时只需访问某些分区数, 减少了对大表的全表扫描, 缩短了磁盘检索时间, 加快了查询速度。 (2) 减少管理负担:与在一个大对象上执行操作相比, 在小对象上执行同样的操作从本质上讲更为容易, 速度更快, 而且占用的资源也更少。对数据表进行分区后利于数据的备份与恢复, 并且可以灵活分配磁盘使用, 极大地提高了磁盘性能, 便于管理。 (3) 提高可用性:表中的每个分区具有很好的独立性, 对象中一个分区的可用性或不可用性并不意味着对象本身是不可用的。此外还可以通过减少出现错误时的停机时间来提高可用性, 因为恢复所需的工作量大幅减少。 (4) 分区对用户透明, 最终用户感觉不到分区的存在[3]。
2 Oracle分区技术介绍
针对大型数据表的管理, Oracle数据库管理系统提供了区间分区、列表分区、散列分区、组合区间-列表分区、组合区间-散列5种分区方案, 其特点如下: (1) 区间分区 (range partitioning) :由一定范围值的分区关键字指定每个分区, 这是最常用的分区类型 而且常常分区键为日期类型。 (2) 列表分区 (list partitioning) :由列表值的分区关键字指定每个分区, 能够准确地控制数据行到分区的映射, 用一种自然方式组织无序和无关联的数据集。 (3) 散列分区 (hash partitioning) :将散列算法用于分区关键字来确定指定行的分区, 通过散列函数控制数据行到分区的映射, 分区易于实现, 并且有助于提高并行查询、连接等操作的执行性能。 (4) 组合分区 (composite partitioning) 组合分区首先进行区间分区, 然后在每个子分区中使用散列或列表分区。组合区间-散列分区结合了区间分区提供的增强的管理性和散列分区并行化查询的优势, 组合区间-列表分区结合了列表分区的可管理性和列表分区用于准确控制的优势。
以上4种分区方案都具有各自不同的应用特征, 因此在选择何种分区方案前需对实施的对象进行综合分析, 在实际应用中根据需求及分区键的属性特征选定一种适合的分区方法。下面将结合公共卫生数据共享中法定报告传染病历史数据管理说明如何应用分区方案。
3 Oracle分区技术在公共卫生数据共享数据管理系统中的应用
法定报告传染病历史数据是我国公共卫生数据共享中的一个重要部分, 该数据库存储了1997年至今的全国至县级的法定报告传染病报告数据:分地区统计表、分年龄性别统计表和分职业统计表, 每张表的数据量均为千万级, 而且每年都有几百万的数据增长量, 每天都有各地疾病预防控制相关部门进行数据访问, 系统吞吐量和数据访问量巨大。因此选择采用Oracle分区技术对这3张表进行有效的分区管理, 用以提高系统的访问性能和维护性能。
3.1 选择分区表的策略
分区键的选择是决定分区方案的关键步骤。分区键的值分布得越平均, 各分区的空间大小就越均等, 磁盘I/O负载就越均衡[4], 因此分区键决定了采用的分区方案。
法定报告传染病历史数据是以时间年度进行管理维护的, 以分地区统计表为例, 该表记录了历年各地各类法定报告传病的发病和死亡情况。根据业务需求, 传染病历史数据一般按时间进行查询和维护, 且表中的year (年份) 字段记录了传染病报告的年份。因此采用了列表分区方案, 选用表中的year (年份) 作为分区键。这样当有新年度的数据加入时, 只需要增加一个新的分区就可以了, 大大减少了数据管理的负担。图1说明了对分地区统计表应用列表分区后的结构。
3.2 建立分区表
确定了分区策略后将按照相应的策略建立对应的分区表。以下是建立T_CRB_REGION表的操作语句, 需要指定表名、列名和列的数据类型等。
这是创建分区表的语句, 其中指定了按照year (年份) 进行分区。例如, 年份等于“1997”的数据将放在“P 1997”分区中, 其他分区也依此原则建立。注意最后一个分区的定义, 不需要为最后一个分区指定列表值, DEFAULT关键字告诉Oracle使用这个分区存放任何前面分区所不能存放的数据。
3.3 创建索引分区
上面的关键字LOCAL告诉Oracle为表T_CRB_REGION的各分区创建独立的索引。
3.4 分区表的维护
Oracle中提供了查看分区、增加分区、删除分区、移动分区、分割分区、合并分区、截取分区、导出分区和导入分区等分区维护方法[5]。通过这些方法可以对分区表进行管理和数据的备份与恢复等工作, 使得历史数据的管理变得更加简便灵活;可以随时从数据表中备份出暂时已经不需要的历史数据分区数据, 然后从数据表中删除对应分区, 这样将大大减少数据表的规模, 提升数据库和应用系统的性能;当需要时也可以很方便地通过增加分区来恢复数据。
3.5 系统优化后的运行效果
(1) 大大改善了系统性能, 成倍提高了查询和统计的速度。对大数据表进行分区管理后, 表的查询、统计等操作可以分解到表的不同分区来并行执行, 跳过无关分区的访问, 大大提高了运行速度, 某些查询操作时间缩短了约6~10倍。 (2) 分区对用户完全透明, 不影响查询统计结果, 对已创建分区的数据表进行查询, 跟未分区前的查询是一样的。虽然数据存放在不同的分区上, 但Oracle的列表分区仍可查出正确的结果。 (3) 系统可用提高了, 数据备份与恢复工作变得容易。如果表的一个分区由于系统故障而不能使用, 其余好的分区仍然可以正常使用。把表的不同分区放在不同磁盘驱动器上, 降低了磁盘带来的数据不可用性。利用Oracle表空间具有的联机备份功能[4], 可以在线备份表的分区, 这样备份/恢复过程就更快了。如果属于表的分区需要做存储介质的恢复, 那么该表未受影响的分区依然可以存取。
综上可见, 通过在公共卫生数据共享数据管理系统中合理应用分区技术, 大大改善了系统的性能, 加快了数据查询统计的速度, 降低了数据管理和维护的工作量, 简化了数据的备份与恢复工作, 对建立一个先进、高效的公共卫生数据共享数据管理系统起到了促进作用。当然, 并不是所有的数据库应用都需要使用分区技术, 当数据表记录数大到一定程度时, 使用分区技术才能显著提高系统的可维护性、性能及可用性。
参考文献
[1]樊秀娥, 李欣欣.公共卫生数据共享政策探讨〔J〕.中国卫生工程学, 2006, 5 (2) :113.
[2] (美) Thomas Kyte著, 苏金国, 王小振译.Oracle 9i&10g编程艺术数据库体系结构〔M〕.北京:人民邮电出版社, 2006:900.
[3]庄建阳.ORACLE8的分区管理功能及在社会保险管理管理信息系统中的应用〔J〕.医学信息, 2004, 17 (2) :76-77.
[4]徐小燕, 张桂珠.Oracle表分区技术在税务纳税申报系统的应用研究〔J〕.电脑知识与技术, 2009, 5 (21) :5615-5617.
Oracle分区技术 第5篇
Oracle分区表的应用则可解决以上问题, 通过把一个大型的表按照一定的条件分割成若干个较小的分区, 可以显著提高表的查询性能, 一个查询可能只需要搜索某个或几个分区而不是整个表就可完成。与此同时, 备份和恢复的可操作性亦得到改善, 针对分区的备份和恢复的操作方法更多。
下面以油田开发动态数据库中“采油井日数据”为例详解分区表的具体应用操作方法。
1 分区表与子分区的创建
将一个大型表划分成若干个分区的方法主要有三类:范围分区、散列分区和
列表分区。范围分区按表中字段值的范围来决定存储在哪个分区;散列分区通过在分区键值上执行一个散列函数来决定存储数据的物理位置;列表分区告诉Oracle所有可能的值, 指定应该插入相应行的分区。由于列表分区和范围分区对油田来说是最适用的方法, 所以在此以列表分区法分区并以范围分区法为子分区为例来说明。
在不采用分区时, 通常创建“采油井日数据”表的语句为:
我们采用分区表的方式来创建此表, 以“单位名称”字段的值来划分分区, 一个大数据量的单位划分独立的分区, 剩下的小数据量单位一起放在一个独立分区里。以上语法修改为:
这样, 就把“采油日报”这个与日俱增的大型动态表分成了以单位为分区的分区表, 各单位在查询数据时就不必遍历整个表, 而是仅在自己单位的分区里搜索, 大大提高了查询性能, 缩短了等待时间, 降低了服务器I/O占用率。然而, 随着一年年的推移, 每个单位分区的数据也在不断的扩张, 这时, 我们可以用范围分区法以时间来划分子分区, 进一步提高查询性能。以上语法进一步修改为:
2 索引分区的创建
有分区表, 也有索引分区。下面的语句创建索引分区, 可以为每个分区创建独立的索引分区:
将local关键字改为global可以创建非分区索引, 或与表的分区范围不同的索引值, 全局索引的优势在于唯一性检查的速度快于局部索引。需要注意的是, 全局索引不适用于散列分区或子分区。全局索引的例子如下所示:
3 分区表的管理
可以用alter table命令对分区表进行操作, 可以更改已有的分区结构。同样, 对分区表的插入操作与普通表的操作方法相同, Oralce数据库会根据分区表的定义自动判断新的数据应该存储在哪个分区中。
通过分区表的创建和管理可以看出, 分区表的使用提高了查询性能和服务器的I/O性能, 因此, 对于一个大型表来说, 分区是相当有用的, 且管理与普通表相比并没有增加复杂度。
摘要:本文以油田开发动态“采油井日数据”表为例, 详细介绍了Oracle分区表的应用。分区表的优点在于通过把一个大型的表按照一定的条件分割成若干个较小的分区, 可以显著提高表的查询性能, 一个查询可能只需要搜索某个或几个分区而不是整个表就可完成。备份和恢复的可操作性亦得到改善。管理简单, 与普通表相比并没有增加复杂度。







