CREATE INDEX uppercase_idx ON employees (UPPER(first_name));
有助于提高以下查询的性能:
SELECT * FROM employees WHEREUPPER(first_name) = ‘RICHARD’;
函数索引的优化
用户必须为优化器(optimizer)收集关于函数索引(unction-based index)的统计信息(statistic)。否则处理 SQL 语句时将不会使用此索引。
当一个查询的 WHERE 子句中含有表达式(expression)时,优化器可以对函数索引(function-based index)进行索引区间扫描(index range scan)。例如以下查询:
SELECT * FROM t WHERE a + b < 10;
如果使用表达式(expression) a+b 建立的索引,优化器(optimizer)就能够进行索引区间扫描(index range scan)。如果谓词(predicate,即 WHERE 子句)产生的选择性(selectivity)较低,则对区间扫描极为有利。此外,如果表达式的结果物化在函数索引内(function-based index),优化器将能更准确地估计使用此表达式的谓词的选择性。
优化器(optimizer)能够将 SQL 语句及函数索引(function-based index)中的表达式解析为表达式树(expression tree)并进行比较,从而实现表达式匹配。这个比较过程是大小写无关的(case-insensitive),并将忽略所有空格(blank space)。
逆序键索引
用户可以创建逆序键索引(reverse key index),此处的逆序指索引列值(index key value)得各个字节(byte)按倒序排列,而非索引列(index key)逆序排列。在 RAC 环境中,使用这样的排列方式可以避免由于对索引的修改集中在一小部分叶块(leaf block)上而造成的性能下降。通过使索引的键值逆序排列,可以使插入操作分布在索引的全部叶块中。
使用逆序键索引(reverse key index)后将无法对此索引进行索引区间扫描(index range scanning),因为在逆序键索引中,词汇上(lexically)相邻的索引键(index key)在存储上未必相邻。因此在逆序键索引上只能进行确定键扫描(fetch-by-key scan)或全索引扫描(full-index scan)。
有些情况下,使用逆序键索引(reverse key index)可以令 RAC 环境下的 OLTP 应用效率更高。例如,为一个 e-mail 应用中的所有邮件进行索引:由于用户可能保存旧的邮件,因此索引必须做到既能快速访问最新邮件,也能快速访问旧邮件。
用户使用 REVERSE 就可以轻易地创建逆序键索引(reverse key index)。在 CREATE INDEX语句中使用 REVERSE 关键字作为创建索引的选项:
CREATE INDEX i ON t (a,b,c) REVERSE;
用户也可以在 REBUILD 子句后添加 NOREVERSE 关键字将一个逆序键索引(reverse key index)转换为常规的索引:
ALTER INDEX i REBUILD NOREVERSE;
如果 REBUILD 子句后没有使用 NOREVERSE 关键字,那么逆序键索引(reverse key index)被重建后仍将保持逆序。
位图索引
位图索引也只一种非常重要的索引,在一些特定的环境中,有非常好的效果,但是非常容易被滥用,使用前后需要仔细验证看是否达到预期效果。
表分析
有的时候,我们会发现虽然有索引,但是执行计划不走索引,全表扫描跑的哗哗的,这个时候要查看下这个表的最后的分析时间,如果DBA没有及时做表分析,那么索引可能用不到。
select * from user_tables t ;
找到对应的表的last_analyzed时间;如果时间太老或者没有时间,那么说明这张表需要做表分析了。
表分析一般要在业务性能不太繁忙的时候做,先了解一下什么是表分析:
简单的说,就是收集表和索引的信息,CBO根据这些信息决定SQL最佳的执行路径。通过对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以优化。
oracle的联机文档描述了analyze的做用:
Use the ANALYZE statement to collect non-optimizer statistics, forexample, to:
--使用analyze功能可以收集一些没有进行优化的统计信息,例如:
Collect or delete statistics about an index or index partition, table ortable partition,
--聚集或删除索引或索引分区,表或表分区
index-organized table, cluster, or scalar object attribute.
--索引表,串,或游标的目标属性等统计信息
Validate the structure of an index or index partition, table or tablepartition, index-organized table,
--增加下列结构的有效性:索引或索引分区,表或表分区,索引表
cluster, or object reference (REF).
--串,目标参照
Identify migrated and chained rows of a table or cluster.
--鉴别一个表或串中已经被移动的抑或被锁住的列。
表分析的语句参考:
analyze table tableName compute statistics;
平衡树结构的优势
平衡树数据结构(B-tree structure)具有以下优势:
? 平衡树(B-tree)内所有叶块(leaf block)的深度相同,因此获取索引内任何位置的数据所需的时间大致相同。
? 平衡树索引(B-tree index)能够自动保持平。
? 平衡树内的所有块容量平均在总容量的 3/4 左右。
? 在大区间(wide range)范围内进行查询时,无论匹配个别值(exact match)还是搜索一个区间(range search),平衡树都能提供较好的查询性能。
? 数据插入(insert),更新(update),及删除(delete)的效率较高,且易于维护键值的顺序(key order)
? 大型表,小型表利用平衡树进行搜索的效率都较好,且搜索效率不会因数据增长而降低。
索引唯一扫描
索引唯一扫描(index unique scan)是效率最高的数据访问方式之一。从平衡树索引(B-tree index)中获取数据时将采用此种方式。当一个唯一索引(采用平衡树结构)的全部列都包含在查询条件中,且查询体条件表达式均为等号(equality)时,优化器将选择使用索引唯一扫描。
索引区间扫描
当访问选择性较大的数据(selective data)时 Oracle 常进行索引区间扫