OracleDatabase11g:面向管理员的新增功能9-2OracleDatabase11g:面向管理员的新增功能9-3Oracle分区此幻灯片概括了Oracle分区功能的十年发展过程。注:REF分区支持对子表进行修剪和智能化分区联接。虽然性能方面的改善似乎是最明显的,但也不要忽略其它方面的改进。分区必须考虑性能、可管理性和可用性等所有业务相关领域。OracleDatabase11g:面向管理员的新增功能9-4分区增强功能分区是一种管理大型数据库的重要工具。分区使DBA可以采用“分而治之”的方法管理数据库表(尤其是那些不断增长的表)。经过分区的表允许数据库在保持性能一致的同时,进行扩展以适应超大型的数据集,而不会对管理或硬件资源产生不当的影响。分区可以加快对OracleDB中数据的访问速度。不管数据库有10GB还是10TB的数据,分区都可以使数据的访问速度提高几个数量级。随着OracleDatabase11g的推出,DBA将会发现一系列有用的分区增强功能。这些增强功能包括:•增加了间隔分区•增加了系统分区•增强了组合分区•增加了基于虚拟列的分区•增加了引用分区OracleDatabase11g:面向管理员的新增功能9-5间隔分区在引入间隔分区之前,DBA需要显式定义每个分区的值范围。问题在于,为每个分区显式定义的界限不会随着分区数量的增长而扩展。间隔分区是范围分区的一种扩展,它会在插入表中的数据超过了所有范围分区时,指示数据库自动创建特定间隔的分区。必须至少指定一个范围分区。范围分区的键值可以确定范围分区的上限值(称为转换点),数据库将为超过该转换点的数据创建间隔分区。间隔分区可以完全自动地创建范围分区。管理新分区的创建可能是一项重复性很高的繁重任务。对于可预测性地增加涵盖小范围的分区,如添加新的每日分区,这种情况尤其突出。间隔分区可以通过按需创建分区来自动完成此类操作。使用间隔分区时,需要考虑以下限制条件:•只能指定一个分区键列,并且该键列必须是NUMBER或DATE类型。•索引表不支持间隔分区。•不能为间隔分区表创建域索引。OracleDatabase11g:面向管理员的新增功能9-6间隔分区:示例幻灯片中的示例显示了间隔分区表的创建过程。最初的CREATETABLE语句指定了四个宽度不同的分区。表的这部分采用的是范围分区。该语句还指定了在晚于转换点“1-1-2004”时,将创建宽度为一个月的分区。这些分区是间隔分区。在表中插入一个包含与2004年1月对应的值的行时,将使用此信息自动创建分区Pi1。分区P3的上限代表一个转换点。P3与其之前的所有分区(本例中的P1和P2)都在范围段中,而P3之后的所有分区则在间隔段中。INTERVAL子句的唯一参数是一个间隔类型常量。目前,只能指定一个分区键列,该键列必须是DATA或NUMBER类型。可以使用INTERVAL子句的可选子句STOREIN来指定一个或多个表空间,数据库会以循环方式将间隔分区数据存储到指定的表空间中。OracleDatabase11g:面向管理员的新增功能9-7移动转换点:示例幻灯片中的图形展示了一个典型的信息生命周期管理(ILM)方案,在该方案中,自动创建了一年的分区之后,将合并这些已创建的分区(示例中的SYS_Py和SYS_Pz)以移动转换点。然后,可以将产生的分区移到一个不同的存储中供ILM使用。该示例假定您创建了一个表ORDERS_INTERVAL,该表有一个初始范围分区PREVIOUS,其中存放着2007年之前的订单。定义的间隔为一个月。然后,在2007年和2008年中插入了一些订单,并且假定创建了四个分区。这些分区如图中所示,它们是根据一些系统规则自动命名的。接下来,您决定使用幻灯片中所示的ALTERTABLE语句合并2007年的最后两个分区。您必须合并两个相邻的分区。请注意新的扩展分区语法,使用该语法可以在不知道分区名称的情况下指定分区。该语法使用的表达式必须表示相关分区的可能值。此语法适用于必须引用分区的所有情况,而不管引用的是范围分区、列表分区、间隔分区还是散列分区。它支持所有操作,如删除、合并、拆分等。执行了MERGE操作后,就可以看到转换点发生了移动了。图形的底部显示了现在包含三个分区的新范围段。注:可以更改间隔分区表的间隔,现有的间隔不受影响。OracleDatabase11g:面向管理员的新增功能9-8系统分区使用系统分区可以对任意表进行应用程序控制的分区。在开发自己的分区域索引时,这种方法很有用。数据库提供的功能只是将表细分为无意义的分区。分区的其它所有方面都由应用程序控制。系统分区具备分区的常见优势(可扩展性、可用性和可管理性),但分区和实际数据的放置由应用程序控制。系统分区与其它方法之间最基本的差别是系统分区没有任何分区键。因此,不能将行隐式分配或映射到特定的分区。相反,用户要在插入行时使用扩展分区语法来指定行要映射到的分区。因为系统分区表没有分区键,所以系统分区表没有分区表通常所具备的性能优势。具体地说,就是不支持传统的分区修剪、智能化分区联接等功能。分区修剪是通过访问与在基表中访问的分区相同的系统分区表中的分区完成的。系统分区表具有均匀分区的可管理性优势。例如,可创建一个嵌套表作为系统分区表,该表与基表有相同的分区数。域索引的备份可以由与基表有相同分区数的系统分区表来进行。OracleDatabase11g:面向管理员的新增功能9-9系统分区:示例幻灯片示例中的语法将创建一个包含四个分区的表。每个分区可以有不同的物理属性。INSERT和MERGE语句必须使用扩展分区语法来确定行应插入的特定分区。例如,可以将值(4,5)插入到示例中指定的四个分区中的任何一个分区。删除和更新不需要使用扩展分区语法。但是,由于没有分区修剪功能,所以,如果省略扩展分区语法,则将扫描整个表以执行操作。此示例也突出了不存在行到任何分区的隐式映射这一事实。OracleDatabase11g:面向管理员的新增功能9-10系统分区:准则系统分区表支持以下操作:•分区维护操作和其它DDL(请参见下面的例外)•创建本地索引•创建本地位图化索引•创建全局索引•所有DML操作•使用扩展分区语法的INSERTSELECT由于系统分区的特殊要求,它不支持以下操作:•不支持需要分区键的唯一本地索引•不支持没有分区方法的CREATETABLEASSELECT。无法将行分配到分区,而应先创建表,然后将行插入到各个分区。•SPLITPARTITION操作OracleDatabase11g:面向管理员的新增功能9-11基于虚拟列的分区如果某个表的列值是通过计算函数或表达式得到的,则这些列就称为虚拟列。可以在CREATE或ALTER表操作过程中指定这些列。虚拟列与其它实际表列共享相同的SQL名称空间,并与对其进行描述的基础表达式的数据类型相一致。可像其它表列一样在查询中使用这些列,因此可在SQL语句中提供简单、优美且一致的访问表达式机制。虚拟列的值实际上并未存储在磁盘上的表行中,而是根据需要进行计算。描述虚拟列的函数或表达式应是明确且无掺杂的,即相同的输入值集应返回相同的输出值。可以像使用任何其它表列一样使用虚拟列。可对虚拟列进行索引,可在查询、DML和DDL语句中使用它们。可在虚拟列上对表和索引进行分区,甚至可以收集它们的统计信息。可使用虚拟列分区对表的虚拟列上定义的键列进行分区。对逻辑分区对象的业务要求经常与现有列不一一对应。随着OracleDatabase11g的推出,分区功能得到了增强,可以在虚拟列上定义分区策略,因而可以更加全面地匹配业务要求。OracleDatabase11g:面向管理员的新增功能9-12基于虚拟列的分区:示例请考虑该幻灯片中的示例。EMPLOYEES表是使用标准的CREATETABLE语法创建的。total_compensation列是一个虚拟列,其值的计算方式为:将salary的值与commission_pct加1之后的值相乘。下一个语句将total_compensation(虚拟列)声明为EMPLOYEES表的分区键。如果分区键上的谓词属于以下类型之一,则将对虚拟列分区键执行分区修剪:•等式或Like•列表•范围•扩展分区名称如果两个表之间存在联接操作,则优化程序将确定智能化分区联接(完全或部分)的适用时间,决定是否使用智能化分区联接,并在决定使用时正确注释该联接。这既适用于串行情况也适用于并行情况。为了确定完全智能化分区联接,优化程序将依赖于对两个对象的均匀分区的定义;此定义包括表据以分区的虚拟表达式的等同性。OracleDatabase11g:面向管理员的新增功能9-13引用分区通过引用分区,可以根据表的引用约束条件中引用的此表的分区方案,对表进行分区。分区键是通过现有的父/子关系解析的,并由活动的主键和外键约束条件强制实施。这种方式的优势在于:包含父/子关系的表可以通过从父表继承分区键来进行逻辑均匀分区,而无需复制键列。逻辑相关性也会自动级联分区维护操作,从而使应用程序的开发变得更简单、更不容易出错。OracleDatabase11g:面向管理员的新增功能9-14引用分区:优点如幻灯片中所示,您可以看到使用引用分区的优点。左侧的图形显示了有两个表ORDERS和ORDER_ITEMS时的情况,它们按ORDER_DATE列进行均匀分区。在这种情况下,两个表都需要定义ORDER_DATE列。但是,在ORDER_ITEMS表中定义ORDER_DATE是多余的,因为在两个表之间存在主键/外键关系。右侧的图形显示了使用引用分区时的情况。在这种情况下,不再需要在ORDER_ITEMS表中定义ORDER_DATE列。ORDER_ITEMS表的分区键会从现有的主键/外键关系中进行自动继承。在用于修剪和智能化分区联接时,引用分区具有以下优势:可以使用不同的查询谓词,智能化分区联接仍然有效,例如,按ORDER_DATE进行分区,并对ORDER_ID进行搜索。在以前的版本中,只有分区和谓词相同时智能化联接才有效。注:这种分区方法对嵌套表分区很有用。OracleDatabase11g:面向管理员的新增功能9-15引用分区:示例幻灯片中的示例创建了两个表:•ORDERS:按order_date分区的范围分区表。该表在创建时包含四个分区Q105、Q205、Q305和Q405。•ORDER_ITEMS:引用分区子表:-该表在创建时包含四个分区Q105、Q205、Q305和Q405,每个分区均包含与各自父分区中的ORDERS对应的行。-如果提供了分区描述符,则描述的分区数量必须与引用表中的分区或子分区的数量完全相同。-如果父表是组合分区表,则对于父表的每个子分区该表都有一个分区。-不能为引用分区表的分区指定分区界限。除非与继承的名称存在冲突,否则可以命名引用分区表的分区。在这种情况下,系统将为分区生成一个名称。-如果未显式指定表空间,则引用分区表的分区将与父表的对应分区并列排列。与其它分区表一样,可以指定对象级的默认属性和覆盖对象级默认值的分区描述符。-不能禁用引用分区表的外键约束条件。-不允许添加或删除引用分区表的分区。但是,在父表上执行分区维护操作将自动级联到子表。OracleDatabase11g:面向管理员的新增功能9-15OracleDatabase11g:面向管理员的新增功能9-16组合分区增强功能OracleDatabase11g之前的版本仅支持范围-列表和范围-散列组合分区方法。在此新版本中,列表分区可以是组合分区表的顶级分区方法,为用户提供列表-列表、列表-散列、列表-范围和范围-范围组合方法。随着间隔分区功能的推出,现在还支持间隔-范围、间隔-列表和间隔-散列组合分区方法。范围-范围分区范围-范围组合分区可以在两个维上进行逻辑范围分区,例如,按order_date的范围分区和按shipping_date的范围子分区。列表-范围分区列表-范围组合分区可以按指定的列表分区策略进行逻辑范围子分区,例如,按country_id的列表分区和按or