Oracle8i的很重要的一个新特性就是增加了function-based index这种索引类型(后面简称为FBI)。

有了这个特性后,Oracle DBA就可以在索引中使用函数或者表达式了。这些函数可以使Oracle自己的函数,

也可以使用户自己的PL/SQL函数等。

DBA在SQL语句调优的过程中遇到的一个很常见的问题就是,如何优化那些在WHERE子句中使用了函数的语句。

因为在以前,在WHERE子句中使用函数会使在这个表上创建的索引没法利用,从而难以提高这个语句的性能。

例子:

使用基于成本的优化器,索引为标准的B树索引,建立在SURNAME列上。

SQL>create index non_fbi on sale_contacts (surname);

SQL>analyze index non_fbi compute statistics;

SQL>:analyze table sale_contacts compute statistics;

SQL>SELECT count(*) FROM sale_contacts

WHERE UPPER(surname) = 'ELLISON';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=17)

1 0 SORT (AGGREGATE)

2 1 TABLE ACCESS (FULL) OF 'SALES_CONTACTS' (Cost=3 Card=16 Bytes=272)

从SQL*PLUS的autotrace产生的执行路径可以看到,虽然我们在WHERE子句中用到的SURNAME列上创建了索引,但是仍然执行的是全表扫描。如果这张表很大的话,这回消耗大量的时间。

现在我们试着建立一个FBI索引:

SQL>create index fbi on sale_contacts (UPPER(surname));

SQL>analyze index fbi compute statistics;

SQL>analyze table sale_contacts compute statistics;

SQL>SELECT count(*) FROM sale_contacts WHERE UPPER(surname) = 'ELLISON';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=17)

1 0 SORT (AGGREGATE)

2 1 INDEX (RANGE SCAN) OF 'FBI' (NON-UNIQUE) (Cost=2 Card=381 Bytes=6477)

从SQL*Plus返回的执行计划我们可以看到,这次,Oracle对表不再全表扫描,而是先扫描索引,因为优化器可以知道FBI索引得存在。

使用FBI索引所能够带来的性能提升取决于表的大小、表中重复记录的量、在WHERE子句中使用的列等因素。

有一点需要清楚,FBI索引并不真正在索引里边存储了表达式的结果,而是使用了一个“表达树”(expression tree)。

由优化器来对SQL语句中的表达式进行解析,并且和FBI索引上面的表达式进行对比。这里,SQL函数的大小写时敏感的。

因此要求SQL语句中使用的函数和创建FBI索引得时候的那个SQL函数的大小写一致,否则无法利用这个FBI索引。

因此,在编程的时候要有一个良好的编程风格。

Init.ora里边需要修改的参数

下面这几个参数必须在init.ora里边指定:

QUERY_REWRITE_INTEGRITY = TRUSTED

QUERY_REWRITE_ENABLED = TRUE

COMPATIBLE = 8.1.0.0.0 (or higher)

授权:

要使一个用户能够创建FBI索引,他必须被授予以下权限:CREATE INDEX和QUERY REWRITE,或者CREATE ANY INDEX和GLOBAL QUERY REWRITE这两个权限。

索引的使用者必须能够有那个FBI索引上使用的那个函数的执行权限。如果没有相应的权限,那么这个FBI索引得状态将变成DISABLED(DBA_INDEXES)。

如果那个FBI索引得状态是DISABLED,那么DBA可以这样来处理:

a:删除并重建

B:ALTER INDEX index_name ENABLED。这个Enabled只能对FBI索引使用。

C:ALTER INDEX UNUSABLE;

注意:如果一个查询中使用到了这个索引,但是这个FBI索引的状态是DISABLED,但是优化器选择了使用这个索引,那么将会返回一个Oracle错误。

例子:

ORA error:

ERROR at line 1: ORA-30554: function-based index MYUSER.FBI is disabled.

而且,一旦这个FBI索引的状态是Disabled,那么这张表上所有涉及索引列的DML操作也将失败。除非这个索引得状态变成UNUSABLE,而且在初始化参数里边指定SKIP_UNUSABLE_INDEXES为TRUE。

一些例子:

SQL>CREATE INDEX expression_ndx

ON mytable ((mycola + mycolc) * mycolb);

SQL>SELECT mycolc FROM mytable

WHERE (mycola + mycolc) * mycolb

复合索引的例子:

SQL>CREATE INDEX example_ndx

ON myexample (mycola, UPPER(mycolb), mycolc);

SQL>SELECT mycolc FROM myexample

WHERE mycola = 55 AND UPPER(mycolb) = 'JONES';

限制和规则总结:

对于下面这些限制,不能创建FBI索引:

a) LOB 列

b) REF

c) Nested table 列

d) 包含上面数据类型的对象

FBI索引必须遵守下面的规则:

a) 必须使用基于成本的优化器,而且创建后必须对索引进行分析

b) 不能存储NULL值。因为任何函数在任何情况下都不能返回NULL值。

c)如果一个用户定义的PL/SQL例程失效了,而且这个例程被FBI索引用到了,那么相应的这个FBI索引会变成DISABLED

d)创建FBI索引得函数必须是确定性的。即,对于指定的输入,总是会返回确定的结果。

e) 索引的属主如果没有了在FBI索引里面使用的函数的执行权限,那么这个FBI索引会变成DISABLED.

f) 在创建索引得函数里面不能使用SUM等总计函数。

g)要把一个DISABLED了的索引重新变成ENABLED,这个函数必须首先是ENABLED的才可以。

sgkmo - by - 09 五月, 2006 10:55

分享至:

oracle的函数索引怎么建,如何创建oracle函数索引相关推荐

  1. 无法对表创建多个聚集索引。请在创建新聚集索引前删除现有的聚集索引的问题

     前言 最近在一次面试中,讨论了一个这样的问题:主键和索引有什么区别?当时我的回答是这样的:"主键就是加了唯一性约束的聚集索引." "你确定你所说的是对的?" ...

  2. 数据库创建函数_达梦数据库创建UUID函数

    数据库创建函数_达梦数据库创建UUID函数 接触达梦数据库有一段时间了,整理了一些资料,今天分享一下达梦数据UUID自定义函数 UUID函数定义 很多数据库都有提供UUID函数,可是接触达梦数据库后, ...

  3. db2 控制台执行创建函数语句_DB2数据库中创建定义函数

    本文将为您详细介绍DB2数据库中创建用户自定义行数,用以扩展扩展内置的 DB2 函数的方法,供您参考,希望对您有所帮助. 可以创建用户定义函数来扩展内置的 DB2 函数.例如,创建计算复杂的算术表达式 ...

  4. oracle为表空间增加数据文件,创建Oracle表空间,增加数据文件的步骤

    经过长时间学习创建Oracle表空间,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西. 1.先查询空闲空间 select tablespace_name,file_id,blo ...

  5. oracle 手动注册服务器,linux下手动创建Oracle数据库

    在linux平台上手动创建数据库(Oracle 10g),安装Oracle软件后,用手动创建数据库可以锻炼自己能力并能够了解数据库创建的全过程,步骤如下: 1.创建Oracle的SID,如果在linu ...

  6. mysql建表索引_Mysql建表+创建索引

    创建表时可以直接创建索引,这种方式最简单.方便.其基本形式如下: CREATE TABLE 表名( 属性名 数据类型[完整性约束条件], 属性名 数据类型[完整性约束条件], ...... 属性名 数 ...

  7. mysql索引组织结构_MySQL中创建及优化索引组织结构的思路(3)

    4.根据业务规则描述需要使用操纵数据的SQL语句 EXPLAINSELECT*FROMgoods_orderWHERE`order_id`=40918986; SELECT*FROMgoods_ord ...

  8. android java函数_java – 在android中创建全局函数

    像这样创建类并在此处添加您的函数: package com.mytest; import android.content.Context; import android.net.Connectivit ...

  9. oracle 创建cdb,Oracle CDB(Container Database)的创建 - Oracle教程 - W3xue.com

    Container Database(容器数据库,CDB)与Pluggabble Database(可插拔式数据库,PDB)是12c中一个标志性的新特性.下面,我们先来看一下CDB的创建.关于CBD新 ...

最新文章

  1. 什么BRIEF算法?BRIEF算法详解
  2. AI 医学影像辅助诊断的商业模式分析
  3. 《互联网人求职图鉴》:这类人才“最吃香”,最高薪编程语言出炉!
  4. 评论:苹果APP STORE面临失贞可能?
  5. framework之Activity 生命周期解析(基于Android11源码)
  6. 用g++编译生成动态连接库*.so的方法及连接(dlopen() dlsym() dlclose())
  7. USB 之四 USB 发展(更名)史 / USB 规范变化
  8. 快速开发平台网格部件合并单元格。
  9. 【PAT甲级 进制转换】1019 General Palindromic Number (20 分) Java版 7/7通过
  10. python神奇的小海龟_Python笔记_第一篇_面向过程_第一部分_8.画图工具(小海龟turtle)...
  11. 复选框的遍历和选中设置
  12. 不能忽视的情绪 -- 喜怒哀惧,也不过度关注
  13. r4烧录卡内核安装_R4 Wood内核怎么用?R4烧录卡Wood R4内核详细使用教程
  14. simulink-EtherCAT工具箱常用模块的简要介绍
  15. Ardunio开发实例-ADS1115模数转换器
  16. Postman代理设置
  17. Elasticsearch 7.x 常用指标聚合、桶聚合搜索RESTful API
  18. 大数据告诉你——垃圾围城,现行的垃圾分类制度,作用到底能有多大?
  19. [Tableau] Tableau知识技能
  20. 【概率论与数理统计】猴博士 笔记 p36-37 协方差、相关系数、不相关、相互独立时的期望和方差

热门文章

  1. 电脑安装python失败-解决“Windows 7 Python3.6 安装失败”问题
  2. python怎么做图形界面-图形界面
  3. 用python画雪花-python使用turtle库与random库绘制雪花
  4. 怎么把python结果全部显示-python – 如何展开输出显示以查看更多列?
  5. 快速记忆python函数-【速学速记】Python 高阶函数
  6. python三层装饰器-python 3层装饰器及应用场景
  7. python九九乘法口诀表-python打出九九乘法口诀表
  8. python是什么怎么用-什么是python items函数?怎么使用它?
  9. python脚本实例手机端-python调用adb脚本来实现群控安卓手机初探
  10. python编程基础与应用-Python程序设计基础与应用