`
pterodactyl
  • 浏览: 766629 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何创建oracle函数索引

阅读更多

如何创建oracle函数索引

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

 

 

如何创建oracle函数索引


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的才可以。

分享到:
评论

相关推荐

    oracle函数大全(CHM格式).rar

    "Oracle函数大全(CHM格式).rar"这个压缩包显然包含了关于Oracle数据库中各种函数的详细信息,对于学习和查询Oracle函数是非常宝贵的资源。 CHM(Compiled Help Manual)格式是一种由Microsoft开发的帮助文件格式...

    Oracle数据库索引优化方法探析.pdf

    索引优化方法有多种,包括重新设计索引、避免系统排序和使用函数索引等。重新设计索引可以避免全表扫描操作,降低资源消耗,缩短执行时间。避免系统排序可以减少排序操作的时间和空间消耗。使用函数索引可以提高查询...

    函数索引使用

    下面给出两个具体的函数索引创建示例: **示例1**:基于多个列上的函数创建复合函数索引。 ```sql SQL> CREATE INDEX example_ndx ON myexample(mycola, UPPER(mycolb), mycolc); SQL> SELECT mycolc FROM ...

    oracle中索引的使用

    函数索引允许在列上应用函数后再创建索引,如对日期字段进行年份提取后建索引。唯一索引则确保索引列中的每个值都是唯一的,有助于维护数据的完整性。 创建索引有多种方式,如通过CREATE INDEX语句直接创建,或在...

    postgresql 兼容 oracle 函数

    5. **序列对象**:Oracle中的序列在PostgreSQL中可以通过创建序列类型来模拟,orafce提供了类似于Oracle的序列操作函数。 6. **其他兼容性特性**:还包括异常处理、游标处理、包的创建等,以尽可能地模拟Oracle的...

    oracle约束和索引笔记

    - **函数索引(Function-Based Index)**: 允许基于函数的结果创建索引,使得对函数结果的查询能利用索引。 - **唯一索引(Unique Index)**: 确保索引键的唯一性,与唯一约束相似,但不强制非空。 - **分区索引...

    oracle 索引创建.ppt

    在“湖南电信Oracle培训之索引创建.ppt”中,我们可推断出讨论的重点是如何在Oracle数据库中创建和理解索引的内部结构。 首先,索引分为几种主要类型,包括B树索引、位图索引、函数索引和全局唯一索引等。B树索引是...

    ORacle 全文索引

    Oracle全文索引是Oracle数据库系统中的一个重要特性,它允许用户对数据库中的文本数据进行高效的全文搜索。全文索引使得在海量文本数据中查找特定词汇或短语变得快速且简便,对于那些需要处理大量文本信息的应用程序...

    oracle 索引创建

    ### Oracle索引创建详解 #### 一、Oracle索引的重要性及基本概念 在数据库系统中,索引是一种用于提高数据检索速度的数据结构。对于大型数据库系统而言,索引的合理设计与使用对于提升查询性能至关重要。Oracle...

    ORACLE索引详解及SQL优化

    Oracle支持多种类型的索引,包括B树索引、位图索引、函数索引和唯一索引等。其中,B树索引是最常见的一种,它通过分层结构快速定位数据行。位图索引则适合于低基数(即某个字段值较少)的列,通过位图方式存储,节省...

    Java调用oracle函数返回oracle类(类似)集合

    2. **创建Oracle函数返回索引表**: 在PL/SQL中,你可以定义一个函数,使其返回上述索引表类型。下面的`funtry_ret_index`函数创建了一个`sqlindext`类型的实例`array`,并填充了一些值,然后将其返回。 ```sql ...

    09 oracle的索引 PPT

    - Function-Based索引:基于函数的结果创建索引,索引列是函数的输出。 - Reverse索引:反向键索引,用于存储数据的反向副本,提高某些查询性能。 - Unique索引:确保列中的值是唯一的。 - Index-Organized ...

    Oracle 索引练习语句程序

    通过以上示例,我们学习了Oracle数据库中索引的基本使用方法以及一些高级特性,如分区表索引、唯一索引、函数索引等。此外,还了解了如何通过实际的数据操作来测试索引的性能效果。这些知识点对于深入理解和掌握...

    ORACLE函数大全CHM

    本资源“ORACLE函数大全CHM”显然是一个针对Oracle数据库中的各种函数的参考手册,旨在帮助开发者和DBA深入理解和使用Oracle的内置函数。CHM文件是一种常见的Windows帮助文档格式,通常包含丰富的文本、索引和搜索...

    合理创建和使用索引 提高Oracle查询效率.pdf

    函数索引是一种特殊的索引类型,它可以对包含字段的函数或表达式创建索引。函数索引可以是B+树索引,也可以是位图索引。在函数索引的表达式中可以使用各种运算符、PL/SQL函数和内置SQL函数,但不能使用聚合函数,如...

    Oracle 索引

    Oracle提供了多种类型的索引,包括B树索引、位图索引、函数索引、唯一索引和复合索引等,每种都有其独特的应用场景和优缺点。 1. **B树索引**:这是最常见的索引类型,适用于频繁的查询操作。B树索引通过排序的数据...

    oracle函数大全(word+chm双版本)

    其次,`Oracle函数大全.chm`是Windows的帮助文件格式,这种格式通常包含更丰富的索引和搜索功能,方便快速查找特定函数。CHM文件可能包含了每个函数的详细语法、参数、返回值以及示例,帮助用户深入理解并实际应用...

    Oracle Index 索引介绍

    4. **函数索引(Function-Based Index)** 允许基于列的函数结果创建索引,使得对函数的结果进行查询时,无需实际计算。 5. **分区索引(Partitioned Index)** 对于大型表,可以将索引分成多个部分,每个部分...

    Oracle函数列表速查andOracle数据字典

    本资料主要涵盖了两个核心方面:Oracle函数列表速查和Oracle数据字典。 首先,Oracle函数列表速查是数据库管理员和开发人员日常工作中不可或缺的工具。Oracle数据库提供了丰富的内置函数,用于处理各种数据类型,...

Global site tag (gtag.js) - Google Analytics