Oracle FBI索引是Oracle8i的新特性,下面就为您详细介绍Oracle FBI索引的概念及使用,如果您对Oracle FBI索引方面感兴趣的话,不妨一看。
Oracle8i的很重要的一个新特性就是增加了function-based index这种索引类型(后面简称为FBI)。有了这个特性后,Oracle DBA就可以在索引中使用函数或者表达式了。这些函数可以使Oracle自己的函数,也可以使用户自己的PL/SQL函数等。
DBA在SQL语句调优的过程中遇到的一个很常见的问题就是,如何优化那些在WHERE子句中使用了函数的语句。因为在以前,在WHERE子句中使用函数会使在这个表上创建的索引没法利用,从而难以提高这个语句的性能。 例子:
使用基于成本的优化器,索引为标准的B树索引,建立在SURNAME列上。
SQL>createindexnon_fbionsale_contacts(surname); SQL>analyzeindexnon_fbicomputestatistics; SQL>:analyzetablesale_contactscomputestatistics; SQL>SELECTcount(*)FROMsale_contacts WHEREUPPER(surname)='ELLISON'; ExecutionPlan ---------------------------------------------------------- 0SELECTSTATEMENTOptimizer=CHOOSE(Cost=3Card=1Bytes=17) 10SORT(AGGREGATE) 21TABLEACCESS(FULL)OF'SALES_CONTACTS'(Cost=3Card=16Bytes=272)
从SQL*PLUS的autotrace产生的执行路径可以看到,虽然我们在WHERE子句中用到的SURNAME列上创建了索引,但是仍然执行的是全表扫描。如果这张表很大的话,这回消耗大量的时间。 现在我们试着建立一个Oracle FBI索引:
SQL>createindexfbionsale_contacts(UPPER(surname)); SQL>analyzeindexfbicomputestatistics; SQL>analyzetablesale_contactscomputestatistics; SQL>SELECTcount(*)FROMsale_contactsWHEREUPPER(surname)='ELLISON'; ExecutionPlan ---------------------------------------------------------- 0SELECTSTATEMENTOptimizer=CHOOSE(Cost=2Card=1Bytes=17) 10SORT(AGGREGATE) 21INDEX(RANGESCAN)OF'FBI'(NON-UNIQUE)(Cost=2Card=381Bytes=6477)
从SQL*Plus返回的执行计划我们可以看到,这次,Oracle对表不再全表扫描,而是先扫描索引,因为优化器可以知道FBI索引得存在。 使用Oracle FBI索引所能够带来的性能提升取决于表的大小、表中重复记录的量、在WHERE子句中使用的列等因素。 有一点需要清楚,Oracle FBI索引并不真正在索引里边存储了表达式的结果,而是使用了一个”表达树”(expression tree)。
【编辑推荐】
详解Windows下卸载Oracle数据库
详解如何将Oracle安装为Linux服务
详解Oracle多种表连接方式
oracle中使用SQL递归语句的例子
初识Oracle裸设备二十问