Oracle与提高性能有关的特性与提高性能有关的特性与提高性能有关的特性与提高性能有关的特性本章讨论Oracle服务器内容,管理员可通过这些方面来提高数据库性能。尽管这些主题属于Oracle服务器的一部分,但测试人员可将这些方面当作提高数据库性能的手段。我们知道,数据库索引是创建在数据之上的为提高数据访问性能的对象。在设计数据库索引时,必须谨慎并且需要了解用户访问数据的模式。在某些情况下,设计不善的索引将导致系统性能的下降,本章索引是我们讨论的重点。这里列出了讨论需要的参数以及其使用方法。MAX_DSPATCHERS:这个参数指定了系统允许同时进行的调度进程的最大数量。MAX_SHARED_SERVERS:这个参数指定了系统允许同时进行的共享服务器进程的最大数量。如果系统中出现的人为死锁过于频繁,那么管理员应该增大这个参数的值。PARALLEL_ADAPTIVE_MULTI_USER:当这个参数的值为TRUE时,系统将启动一个能提高使用并行执行的多用户系统性能的自适应算法。这个算法将根据查询开始时的系统负载自动降低查询请求的并行度。PARALLEL_AUTOMATIC_ENABLED:如果将这个参数的值设置为TRUE,那么Oracle将确定控制并行执行的参数的默认值。PARLLEL_BROADCAST_ENABLED:这个参数允许管理员提高散列连接和合并连接操作的性能,在这样的连接操作中,系统将一个大尺寸的结果集与一个小尺寸的结果集连接在一起(在合并操作中,数据的尺寸是根据字节数,而不是记录数确定的)。PARLLEL_EXECUTION_MESSAGE_SIZE:这个参数指定了系统并行执行时的消息的尺寸(在Oracle的旧版本中,这个概念是指并行查询、PDML、并行恢复和并行复制数据等)。PARLLEL_MAX_SERVERS:这个参数指定了实例能同时运行的并行执行进程和并行恢复进程的最大数量。随着用户需求的增长,在创建实例时为这个参数设置的值将不再能满足用户需求,所以应当增大这个参数的值。PARLLEL_MIN_PERCENT:系统将联合使用PARLLEL_MAX_SERVERS、PARLLEL_MIN_SERVERS和该参数。这个参数允许指定并行执行进程(即参数PARLLEL_MAX_SERVERS之值)的最小百分比。PARLLEL_MIN_SERVERS:这个参数指定了实例并行执行进程的最小数量。其值就是实例启动时Oracle创建的并行执行进程数。PARLLEL_THREADS_PER_CPU:这个参数指定了实例默认的并行度和并行自适应以及负载平衡算法。它指明了并行执行过程中一个CPU能处理的进程或线程数。PARTITION_VIEW_ENABLED:这个参数指定了优化器是否使用分区视图。Oracle推荐用户使用分区表(这是在Oracle8之后引入的)而不是分区视图。分区视图只是为了提供Oracle的后向兼容性。REVOVERY_PARALLELISM:这个参数指定了恢复数据库系统时使用的进程数。索引索引索引索引在数据库系统中,索引是一种可选结构,其目的是提高数据访问速度。不论在物理上还是逻辑上,Oracle数据库的索引都是独立于与之相关的表或簇中的数据的。可利用索引来提高用户访问数据的速度或直接从索引中独立检索数据。如果对索引的配置和使用进行了优化,那么索引能大大降低数据文件的I/O操作和提高系统性能。对用户或应用程序而言,索引是透明的,且不需对应用程序做任何修改。但是,如果知道数据库中存在某个索引,那么可能在编写SQL语句时充分利用这个索引。索引的唯一优势在于可以提高用户访问数据的速度。在为一个表创建索引之后,Oracle将自动维护这个索引。当用户在表中插入、更新或删除记录时,系统将自动更新与该表相关的索引。一个表可以有任意数量的索引,但一个表的索引越多,用户在该表中插入、更新或删除记录时所导致的系统开销也越大。其原因是无论何时更新表,系统都必须更新与之相关的索引。与索引有关的概念索引是建立在表的一个或多个字段之上的。索引的作用大小取决于该字段或字段集的选择性。所谓选择性是指索引能降低数据集中的程度。如果表中与某个索引相关的字段值各不相同,那么该索引就有很好的选择性,一个选择性很差的索引的例子是基于字段值仅为true/false的字段创建的索引,因为表中很多记录该字段的字段值都相同。在本章后面部分,读者将明白选择性将帮助程序员创建不同类型的索引。一个索引可能只能帮助管理员降低检索的记录数,而不能唯一地确定一条记录。例如:如果为一个表的LastName字段创建了一个索引,现在用户需要搜索JohnSmith,那么这个索引将返回LastName字段值为Smith的所有记录,因而用户还不得不在返回的记录中搜索含John的记录。索引的选择性越好,就越有助于降低返回记录的数量,从而提高数据访问速度。索引类型在Oracle数据库中,可使用两种主要的索引类型,这两种主要索引类型的索引还包含了几个子类型索引。这两种主要类型的索引是B-tree(B树)索引和bitmap(位图)索引。B树索引的形状象一棵树,搜索条件将遍历整棵树以找到用户请求的数据。而位图索引将为与该索引相关的数据文件的每个不同值创建一个位图并利用这个位图检索数据。在本章后面读者将会看到在某些情况下位图索引是非常有用的。B树索引有几种子类型,而位图索引却没有任何子类型。一个B树索引可限于表的一个或多个字段。索引可以是唯一的也可以不是唯一的。可根据应用程序所访问记录的字段值来创建索引;而应用程序开发者也应当开发能充分利用索引的应用程序。B树索引B树索引是最普通的索引类型。B树索引使用属性搜索来检索该索引指定的记录。在B树索引中,数据被存放在一棵倒置的树上,B树索引也因此而得名。实际上,Oracle的索引称为平衡树索引(BalancedTreeIndex),平衡树索引的最高层(搜索开始的地方)称为根节点,树的末端(存放记录ID的地方)称为叶节点,位于根节点和叶节点之间的节点被称为枝节点。当创建一个索引时,系统将自动为该索引创建一个索引段。索引段包含能加快数据访问速度的信息,其原理是使用尽可能少的I/O操作确定被索引记录的位置。Oracle正是通过著名的B树索引结构来检索数据的。B树索引的目的是平衡数据访问时间。如图111所示,B树索引是降序比较字段值的索引。当系统向下遍历B树索引时,系统将用户需要查询的值与B树的上层节点——即所谓的枝节点——进行比较。根据比较结果,系统将用户的查询值与更多的枝节点进行比较,直到达到最底层的索引节点为止。最底层的索引节点,即根节点,包含了所有被索引的数据值和相关记录的ID。对于唯一性索引,根节点的数据值中只存在一条记录的ID。而对于非唯一性索引根节点的数据值中可能存在多条记录的ID。对于非唯一性索引,系统首先按照索引关键字对叶节点数据值进行排序,然后再按照数据记录的ID进行排序。在B树索引中,所有叶节点都处于同一层次。不论叶节点的数据为何值,访问数据所花的时间都大致相同。不管是使用精确匹配还是基于某个范围内的查询,B树索引都为用户提供了快速访问数据的能力。另外,不论表的规模有多大,B树索引都能够提供很好的性能,而且表规模的增长不会降低索引性能。B树索引包含了几类子索引。下面将分别介绍这些子索引。一、唯一性索引和非唯一性索引唯一性索引是值具有附加约束条件的,并且不可能出现重复字段值的索引。尽管管理员可能会指定这里的附加约束条件,但通常情况下将附加约束条件与表相关联比与索引本身相关联要好一些。通过自动在表的唯一键上定义索引,Oracle强制实现了唯一性索引的附加约束条件。非唯一性索引不会附加使索引值必须唯一的约束条件。当用户希望快速访问非唯一性记录时,这种类型的索引是非常有用的。然而,对检索特定记录而言,唯一性索引的性能要优于非唯一性索引,其原因是唯一性索引的值被分解为唯一值。对于非唯一性索引,当系统遍历到索引的最底层时,系统将返回所有满足检索条件的记录。二、简单索引和复杂索引索引的另一种类型是复合索引,即基于表中多个字段的索引。这些字段的值可以以一定的顺序排列,系统不要求这些字段是相邻字段。当SELECT语句中有WHERE子句,并且WHERE字句参考了表中的多个字段时,复合索引是非常有用的。因为系统是按照索引中定义的字段顺序访问索引的,所以聪明的做法是按照字段的访问频率来定义字段在索引中的顺序。检索数据时参考最多的字段应排在第一位,其余字段的排序以此类推。复合索引也非常有利于将多个非唯一性索引字段组合成一个唯一性索引字段集,可利用复合索引创建一个唯一性复合索引。三、基于函数的索引基于函数的索引是指系统设计者或DBA创建的用于访问数据的特定函数。这个函数可以是数学函数也可以是PL/SQL函数。只有当基于该函数的索引被用于SELECT语句的WHERE字句时,该函数才能发挥作用。例如A公司打算给去年在该公司购买了更多产品的所有顾客发感谢信。那么确定应该选择哪些顾客ID的查询语句应该具有如下形式:SELECTcust_idFROMcustomersWHEREthis_years_sales-last_years_sales0可创建一个以c_id字段为变量的函数条件查询,该函数具有如下形式:CREATEINDEXidxONcustomers(this_years_sales-last_years_sales)这个索引既降低了系统负载又提高了查询性能。Oracle位图索引的工作方式位图索引的实现原理与B树索引完全不同。位图索引将为被索引字段中的每个唯一值创建一个位图。这个位图包含了关于哪些记录的字段值等于该字段值的信息。位图索引的优势之一在于管理员可联合使用多个位图索引:这样,这些索引被组合在一起。对于具有唯一值或良好选择性的字段或字段集,B树索引是非常适用的;而位图索引正好相反。位图索引适用于值为yes/no或true/false这样的字段。在找到所包含的很多记录都满足特定检索条件的节点之前,系统将遍历整个B树索引,然后再选择这些记录。而在位图索引中,系统不需要遍历整个索引就能立即找到满足检索条件的记录。如果建立索引的字段因为其字段值没有足够的区分度而不具备良好的选择性,那么为该字段建立一个位图索引是非常合适的。如图4.3所示,如果能联合使用多个字段,并且这些字段的联合位图索引能大大降低系统处理的数据量,那么为这些字段创建一个位图索引是非常适合的。选择创建索引的字段只有正确使用了索引,才能发挥其功能。而索引的使用主要取决于建立索引的字段值。请记住:在一个表上建立的索引越多时,那么在更新、插入或删除记录时所引起得系统开销也越大。因此,有选择的建立索引是非常重要的。下部分内容将介绍有效创建和使用索引的技巧和方法。一、索引和降低系统处理的数据量索引的主要作用之一就是降低系统处理的数据量。对CPU使用和等待完成I/O操作的时间上,I/O操作引起的系统开销都是非常昂贵的。降低I/O操作可提高系统性能和处理能力。如果不使用索引,那么为了找到特定的数据,系统将不得不扫描表中的所有数据。例如如下查询语句:SELECT*FROMempWHEREemployee_id=10290如果不使用索引,系统必须扫描整个emp表并检查表中每条记录的employee_id字段的值。如果emp表很大,那么这个操作可能意味着数量巨大的I/O读写和很长的处理时间。如果为emp表的employee_id字段创建了索引,那么系统将遍历该索引并找到用户所查询记录的ID。找到记录ID之后,只需一条额外的I/O操作就能检索到用户所需数据。用于说明这个问题的最好例子是只需查找一条记录的情况。在表的每条记录中,类似employee_id这样的字段的值可能在整个表中都是唯一的。这意味着查询结果值返回一条记录,这种查询的效率是非常高的。某些情况下,索引必须返回大量数据。如下面的例子:SELECT*FROMcustomersWHEREregion=’North