欢迎来到学术参考网

全文检索应用开发中的性能优化方法

发布时间:2015-08-21 08:51

摘 要:全文检索技术目前广泛应用于互联网搜索领域和企业内容检索领域。但在全文检索应用开发过程中,性能问题常常被忽略,导致在日后使用全文检索功能时,响应时间和吞吐率达不到要求。本文以基于Oracle Text的应用开发为例,详细阐述了全文检索的优化原理,提出了一套便于开发人员使用的性能优化方法,并针对不同的应用场景需求,给出了不同的优化策略。

关键词:全文检索; Oracle Text;性能优化;全文索引
。CONTEXT索引支持所有的全文检索服务,但是效率未必是最高的。
  CTXCAT索引是一种复合索引,建立在文本列和非文本列上。在需要同时索引文本列和非文本列的时候选用该索引最佳,因此它很适用于库存信息查询系统,例如查询经常是同时检索出商品名称、价格、日期、评论等文本和其他数据类型混合的情况。该类索引通常耗费空间比CONTEXT索引较大,需要更多时间来创建,而且不支持分区技术。
  CTXRULE索引适用于文档分类应用的开发。在进行分类之前,需要首先创建一张规则表,然后在此规则表上创建CTXRULE索引,索引中存储了分类规则,例如“IT OR database OR software”。
  为了达到理想的性能指标,需要根据上述索引的特点结合应用需求进行索引选型。
3 全文检索的性能优化技术
3.1  确定优化目标
  在进行调优之前,必须首先明确调优目标,因为不同的应用系统、不同的场合的需求是不同的。常用的调优目标是减少响应时间和增大吞吐量。调优目标不同,在应用开发中的所运用的提示(HINT)和选用的索引也应有所区别。
    优化响应时间:在某些应用场景中,尤其是web应用中,用户期望在最短时间内看到第一页的检索结果,而对是否全部的结果已经检索完毕并不关心。此时应该把缩短响应时间作为调优的首要目标,即优先返回前几条检索结果显示给用户。建议在编写查询时加入FIRST_ROWS提示,该提示可以引导查询优化器选择能够首先返回前几条检索结果的查询计划。在此模式下即使查询很耗时,优化器仍会以尽可能快的速度先返回几条前面的记录让用户浏览,而此时用户的需求实际上也得到了满足,不会关心是否查询到了所有的记录。此外,对于CONTEXT索引还可以使用索引分区技术,为分区表创建与之对应的分区索引,这样在日后的检索过程中,就只需检索相关的分区,避免了全扫描,尤其对于分区键列上的范围搜索和排序,可以显著缩短响应时间。
  优化吞吐量:在如报表批处理系统或OLAP、DSS系统中一般需要尽快返回全部的检索结果。对于此类系统来说,是否尽快响应开始几条记录并不重要,因为没有得到全部结果集之前无法做出有意义的统计分析,因此应该把整体吞吐量作为优化的首要目标。为实现此优化目标,建议在编写查询时加入ALL_ROWS提示,该提示会引导查询优化器选择能提供最大的吞吐量的查询计划,能够尽快地返回全部结果。在已经加入了FIRST_ROWS提示的包含ORDER BY排序的查询中,如果想优化总体吞吐量,可以再加上DOMAIN_INDEX_NO_SORT提示,此后查询就不会再使用域索引返回排序结果,而是首先获取全部满足CONTAINS条件的数据行之后再排序,因此可以加大吞吐量。
3.2  根据需求自定义全文索引
  由于全文检索的过程实际上是搜索全文索引,因此正确地创建全文索引并配置适当的参数对于日后的检索性能有着显著的影响。在创建全文索引时,Oracle Text提供了多种机制允许开发人员对索引进行细节的定制。
  在设计全文检索应用时,首先应根据不同的需求恰当地选用不同类型的索引,并在创建索引的INDEXTYPE字句中指定,例如选用CONTEXT索引就需要加上INDEXTYPE IS t。除了上述的3种常用全文索引之外,还可以根据需要创建CDI复合域索引,该索引可以同时包含全文检索所需的文本列和在WHERE条件及ORDER BY字句中出现的非文本列,因此当查询的WHERE字句和ORDER BY字句中出现非文本列,同时又包含了全文检索操作符的时候,通过创建CDI索引可以大幅提高检索效率,因为无需再扫描多个索引。但是CDI索引的更新比较耗时,因此在频繁更新的应用场景下不宜采用。
  由于含有全文检索对象的表往往数据量较大,创建索引往往耗时较长,此时会阻塞DML操作。为了解决该问题可以采用联机创建索引的技术,即在创建索引时指定ONLINE选项。在联机创建索引的过程中,Oracle会将DML操作临时存放于一个等待队列中,等索引创建完成后再进行同步操作,因此可以缓解对性能的冲击。
  此外由于很多全文检索中大量采用复合查询,可以在创建全文索引的时候指定FILTER BY和ORDER BY选项
  当全文检索对象所在的基表由于DML操作发生改变后,与其相对应的全文索引不会自动发生更新,而是需要手动地完成更新,在更新完成之前,基表中的新内容是不会被检索到的。可以编写一个PL/SQL程序,调用_INDEX存储过程手动地同步索引。在同步索引时为了提高性能可以调整同步索引所用的内存大小和并行度,但是要考虑系统的CPU和空闲内存资源,否则会适得其反。
  然而频繁的索引同步操作会导致全文索引的碎片,过多的碎片会严重降低检索的效率。为了保持良好的检索性能,需要优化全文索引减少碎片。在频繁的DML操作之后,倒排索引中会不必要地增加许多条目。例如某条条目指示包含关键词text的文档有doc1,doc5,doc7,当同样含有关键词text的doc8被存储之后,索引会另外单独为doc8中含有text这个信息创建一条索引条目,因此产生了碎 片。对此可以使用ZE_INDEX存储过程优化索引,减少索引碎片,在整理碎片过程中可以指定工作模式,如果没有特殊需求尽量选用FAST模式,可以整理碎片而不移动行,而且速度较快。
  当一篇文档被删除之后,在全文索引中与之对应的条目不会立即将其删除,而是做一个删除标记。因此当大量文档被删除之后,全文索引中不可避免地会留下许多墓碑标记,不但浪费存储空间而且会降低检索效率。为了回收这些垃圾可以以FULL模式调用ZE_INDEX存储过程,对全文索引做全面整理优化,清除墓碑记录,合并同类索引项。
  有时全文索引中的关键词很多,而只有很少部分的关键词是经常被检索的,这时就可以只优化这些索引项,而不花费额外时间去优化那些不常用的索引项。例如关键词database经常被检索,就可以在ZE_INDEX存储过程中指定token选项为database,即可只针对这个关键词进行索引优化,节省维护时间。
  在大型数据库系统中,通常需要全文检索的表很多,对这些表全部进行优化既不现实也无必要。因此可以首先应用_STATS存储过程产生一个全文索引各项指标的统计报告,该报告显示了索引的碎片情况、碎片最严重的关键词、以及删除标记的情况。有了这些统计信息之后,就可以选择最能提高性能的优化策略了。
3.4  维护统计信息
  在Oracle较新版本中,查询优化器采用改进的CBO(基于成本的优化器),该优化器根据收集来的系统统计信息和对象统计信息计算并比较不同查询计划的成本,选出成本最低的一个作为实际执行的查询计划。因此,统计信息是否实时,是否能比较客观地反应真实的数据情况就成为了确保CBO产生良好执行计划的关键因素,如果长期在DML操作之后没有更新相关的统计信息,CBO就不会知道数据的特征发生了变化,就可能无法产生高性能的执行计划。可以采用手动执行命令ANALYZE TABLE table_name COMPUTE STATISTICS命令收集最新的表对象统计信息,例如记录数、块数、数据分布特征、基数等。此外还可以调用_TABLE_STATS存储过程和_INDEX_STATS存储过程收集表和索引的统计信息,这些存储过程允许设置抽样比和并行度,可以提高收集的效率。可以将这些存储过程写入Oracle的自动维护作业中,令其定期自动执行。
3.5  采用并行技术
  对于耗时较长的检索或维护任务,可以采用并行技术提高效率。但是并非采用并行就一定能优化性能,如果应用场景不适合或者系统资源不满足并行要求,反而往往会使性能进一步恶化。一般情况下,在报表批处理系统或OLAP、DSS系统中数据量较大,可用的CPU较多同时并发用户较少,是采用并行技术的理想场景。同时在Oracle RAC集群的各个节点上采用并行技术也可以达到负载均衡的目的。
  本地CONTEXT索引支持并行检索,根据创建索引时设置的并行度和系统资源属性,多个并行从属进程将在并行协调器的调度下对全文索引进行并行检索。每个从属进程负责检索索引的一个或多个分区,当所有从属进程的工作都完成后,协调器会将它们的返回结果汇总再传递给用户。如要使用并行检索,需要在创建索引和编写查询时指定PARALLEL参数。
  然而对于CPU数量较少负荷已经很重的高并发系统,不宜采用并发技术。因为并发的从属进程数量不可能超过可用的CPU数量而且并行操作消耗系统资源很多,对于高负荷场景,会进一步恶化性能。
3.6  实例参数调整
  由于全文检索操作也需要CBO查询优化器产生执行计划之后才能执行,因此CBO相关的参数配置是否得当也会直接影响到全文检索应用的性能。OPTIMIZER_MODE参数指定优化器的优化模式,即上文所述的以何种指标作为优化目标。OPTIMIZER_INDEX_CACHING参数会影响CBO对于使用索引和嵌套循环连接的成本估算,取值表示在进行嵌套循环连接的时候,CBO优化器会“认为”cache中存在的所需的索引块的百分比。OPTIMIZER_INDEX_COST_ADJ参数是CBO在计算成本时单块I/O与多块I/O的成本之比,加大此值会引导CBO更倾向于选择全表扫描,反之会倾向于索引路径。[5]
  对于全文检索应用也需要配置专门的内存参数以便优化性能。DEFAULT_INDEX_MEMORY指定全文索引可以使用的内存大小,但是其取值不可超过MAX_INDEX_MEMORY。如果全文检索功能经常使用,建议加大此参数的数值,可以改善检索性能,但是也不应太大,以免影响SGA中其他内存池,造成频繁的内存交换和分页。对于排序量很大的应用,需要加大SORT_AREA_SIZE的数值,以便在PGA内存中有更多空间用来排序。
3.7 存储优化
  全文检索的数据量巨大,如果对其存储机制进行优化,不但可以节约存储空间而且可以减少I/O缩短响应时间。效果较好的优化方案包括根据需求多种方式存储全文对象以及采用ASM自动存储管理。
  在创建全文索引时,需要根据文档使用的频度和存储空间要求等因素考虑存储参数的配置,以便达到更好的性能,同时优化存储。Oracle Text对于文本对象提供三种存储方式:直接存储在数据库表中、只存储指向操作系统文件的地址、只存储文本地址的URL。[4]3种方式各有利弊,应该结合现有的IT基础设施架构和存储规划进行选用。例如某些文档不需要跟其他数据库文件存储在一起,或者占用空间过大,就可以以LOB格式存储在数据库外部专用的存储设备上。
  为了最大限度地优化I/O实现负载均衡,可以采用Oracle的ASM自动存储管理机制。创建ASM实例之后,ASM会自动地将数据均匀地存储在不同的通道的不同磁盘上,将I/O请求尽可能均匀化,同时也不必再对文件进行操作,而是对磁盘组进行操作,大大简化了管理,也提高了I/O性能。
4 结束语
  通过以上的研究和论述,本文在揭示了Oracle Text全文检索的优化原理的基础上,分别从全文索引选型、索引定制、后期维护、并行查询、参数调整和存储优化等方面对于全文检索应用给出了全面的、可行的解决方案。实践证明,全文检索应用如果不进行性能优化或者只是片面地优化,很容易会遇到性能不佳或逐渐恶化的问题。运用本文提出的将开发与维护结合起来的全面的优化方法,可以从根本上提高全文检索的效率,改善性能并使良好的性能保持在整个项目生命周期中。  
参考文献:
[1] 蒙辉,陈燕. Oracle Text技术在复杂结构数据库中的应用[J]. 计算机技术与发展, 2007, (0 4) .
[2] 姜春茂, 段莹. ORACLE全文检索技术的应用研究及其优化[J]. 电脑学习, 2006, (01)
[3] Oracle 10g Database Documentation: Text Application Developer's Guide[Z], Oracle Corporation,2003
[4] 龚谷初. Oracle Text全文检索技术在信息管理中的应用[J]. 湖南电力, 2004, (06) .
[5] Oracle 10g Database Documentation: Performance Tuning Guide[Z], Oracle Corporation,2003
[6] Oracle 10g Database Documentation: Text Reference[Z], Oracle Corporation,2003

上一篇:新媒体在突发事件中的舆论引导

下一篇:试论电视记者如何做好现场报道