Oracle索引
- 格式:doc
- 大小:32.00 KB
- 文档页数:3
Oracle索引(Index)介绍使⽤1.什么是引 索引是建⽴在表的⼀列或多个列上的辅助对象,⽬的是加快访问表中的数据;Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶⼦节点不同B*数索引;索引由根节点、分⽀节点和叶⼦节点组成,上级索引块包含下级索引块的索引数据,叶节点包含索引数据和确定⾏实际位置的rowid。
2.使⽤索引的⽬的 当查询返回的记录数排序表<40%⾮排序表 <7%且表的碎⽚较多(频繁增加、删除)时可以加快查询速度减少I/O操作消除磁盘排序3.索引的分类及结构 从物理上说,索引通常可以分为:分区和⾮分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。
其中,B树索引属于最常见的索引,由于我们的这篇⽂章主要就是对B树索引所做的探讨,因此下⾯只要说到索引,都是指B树索引。
B树索引是⼀个典型的树结构,其包含的组件主要是:1) 叶⼦节点(Leaf node):包含条⽬直接指向表⾥的数据⾏。
2) 分⽀节点(Branch node):包含的条⽬指向索引⾥其他的分⽀节点或者是叶⼦节点。
3) 根节点(Root node):⼀个B树索引只有⼀个根节点,它实际就是位于树的最顶端的分⽀节点。
可以⽤下图⼀来描述B树索引的结构。
其中,B表⽰分⽀节点,⽽L表⽰叶⼦节点。
对于分⽀节点块(包括根节点块)来说,其所包含的索引条⽬都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。
每个索引条⽬(也可以叫做每条记录)都具有两个字段。
第⼀个字段表⽰当前该分⽀节点块下⾯所链接的索引块中所包含的最⼩键值;第⼆个字段为四个字节,表⽰所链接的索引块的地址,该地址指向下⾯⼀个索引块。
在⼀个分⽀节点块中所能容纳的记录⾏数由数据块⼤⼩以及索引键值的长度决定。
⽐如从上图⼀可以看到,对于根节点块来说,包含三条记录,分别为(0 B1)、(500 B2)、(1000B3),它们指向三个分⽀节点块。
oracle主键索引和普通索引在关系型数据库中,索引是提高查询效率的重要手段之一。
在Oracle数据库中,主键索引和普通索引是常见的两种索引类型。
本文将介绍它们的定义、特点以及适用场景,以帮助读者理解和正确使用这两种索引。
一、主键索引主键索引是一种用于唯一标识表中记录的索引类型。
在创建表时,可以通过定义主键来自动创建主键索引。
主键索引中的键值必须是唯一的,并且不能为空值。
1. 定义主键索引在创建表时,可以通过在列定义后使用PRIMARY KEY关键字来定义主键。
例如,创建一个名为"customer"的表,并为"customer_id"列定义主键索引,可以使用以下语句:CREATE TABLE customer (customer_id NUMBER PRIMARY KEY,first_name VARCHAR2(50),last_name VARCHAR2(50));2. 特点与优势- 主键索引的键值唯一且不能为空值,确保了表中记录的完整性。
- 主键索引物理上以B树的形式存储,查询速度较快。
- 主键索引可以被外键引用,用于维护表与表之间的引用完整性。
- 主键索引可以用于加速表的连接操作,提升查询性能。
3. 适用场景主键索引适合用于标识唯一记录的列,例如身份证号、学号等。
在高并发的系统中,主键索引的使用可以避免数据冲突和错误插入。
二、普通索引普通索引(也称为辅助索引)是一种非唯一索引类型,可以用于提高查询效率。
与主键索引不同,普通索引的键值可以重复且可以为空值。
1. 定义普通索引在创建表时,可以通过使用CREATE INDEX语句来定义普通索引。
例如,为"product_name"列创建一个普通索引,可以使用以下语句:CREATE INDEX idx_product_name ON products(product_name);2. 特点与优势- 普通索引可以加速查询速度,减少数据扫描的次数。
oracle重建分区索引语句摘要:1.Oracle 分区索引简介2.重建分区索引的原因3.重建分区索引的步骤4.示例:使用SQL 语句重建分区索引正文:一、Oracle 分区索引简介Oracle 分区索引是一种在分区表上的索引,它可以提高查询效率。
分区索引与普通索引类似,但它是基于分区表的,因此具有更高的查询性能。
当数据量较大时,分区索引能够有效地减少查询数据的范围,提高查询速度。
二、重建分区索引的原因重建分区索引通常有以下原因:1.索引损坏:当分区索引损坏时,需要进行重建。
2.数据表分区改变:当数据表的分区发生变化时,需要重建分区索引以适应新的分区结构。
3.优化查询性能:在某些情况下,重建分区索引可以提高查询性能。
三、重建分区索引的步骤1.备份数据:在进行分区索引重建之前,需要备份数据以防止数据丢失。
2.使用ALTER INDEX 命令:使用ALTER INDEX 命令可以重建分区索引。
需要指定要重建的索引名称以及分区信息。
3.检查重建结果:重建完成后,需要检查重建结果以确保索引正确无误。
四、示例:使用SQL 语句重建分区索引以下是一个使用SQL 语句重建分区索引的示例:```sqlALTER INDEX index_nameREBUILD PARTITION p_number;```其中,`index_name`是要重建的分区索引名称,`p_number`是要重建的分区编号。
可以根据实际情况修改相应的参数值。
通过以上步骤和示例,可以完成Oracle 分区索引的重建工作。
在进行分区索引重建时,需要谨慎操作,确保数据安全。
oracle 联合索引原理Oracle是一种关系型数据库管理系统,它的联合索引是一种特殊的索引类型,可以提高查询效率和性能。
本文将介绍Oracle联合索引的原理及其优势。
一、联合索引的定义联合索引是由多个列组成的索引,这些列可以是一个表中的任意列。
与普通索引不同的是,联合索引可以通过多个列的组合进行查询,从而提高查询效率。
当查询条件中涉及到联合索引的列时,数据库可以直接利用联合索引进行快速定位,减少了查询的时间和资源消耗。
二、联合索引的原理1. 索引结构Oracle使用B树索引结构来实现联合索引。
B树是一种平衡二叉树,它可以保持索引的有序性,并且在插入、删除和查询操作中都能够保持较高的效率。
对于联合索引来说,B树的每个节点都包含了多个列的值,这样可以根据查询条件中的多个列进行快速定位。
2. 索引的创建在Oracle中,可以通过CREATE INDEX语句来创建联合索引。
语法如下:CREATE INDEX index_name ON table_name (column1,column2, ...);3. 索引的使用当查询条件中涉及到联合索引的列时,Oracle会自动选择使用联合索引进行查询。
数据库会根据联合索引的列顺序以及查询条件中的列顺序进行匹配,以找到满足条件的记录。
如果查询条件中的列顺序与联合索引的列顺序不一致,数据库可能无法使用联合索引,从而导致查询效率下降。
三、联合索引的优势1. 提高查询效率联合索引可以根据多个列的组合进行查询,从而提高查询效率。
当查询条件中涉及到联合索引的列时,数据库可以直接利用联合索引进行快速定位,减少了查询的时间和资源消耗。
2. 减少存储空间相比于多个单列索引,联合索引可以减少存储空间的占用。
联合索引将多个列的值存储在同一个索引结构中,避免了重复存储的问题。
3. 提高数据维护效率使用联合索引可以减少索引的数量,简化了数据库的维护工作。
当表的数据发生变化时,只需维护少量的联合索引,而不需要维护多个单列索引。
Oracle 分区索引和全局索引对于分区表而言,每个表分区对应一个分区段。
当在分区表上建立索引时,即可以建立全局索引,也可以建立分区索引。
对于合局索引,其索引数据会存放在一个索引段中;而对于分区索引,则索引数据都会被存放到几个索引分区段中。
对索引进行分区的目的与对表进行分区是一样的,都是为了更加易于管理和维护巨型对象。
在Oracle中,一共可以为分区表建立三种类型的索引,下面分别介绍它们的特点和适用情况。
1.本地分区索引本地分区索引是为分区表中的各个分区单独地建立分区,各个索引分区之间是相互独立的。
本地分区索引相对比较简单,也比较容易管理。
图10-4显示了本地分区索引和分区表之间的对应关系:分区索引分区表图10-4 本地分区索引与分区表在为分区表创建本地索引后,Oracle会自动对表的分区和索引的分区进行同步处理。
如果为分区表添加新的分区后,Oracle会自动为新分区建立新的索引。
与此相反,如果表的分区依然存在,则用户将不能删除它所对应用的索引分区。
在删除表的分区时,系统会自动删除所对应的索引分区。
例如,下面的语句为范围分区表SALES_RANGE创建本地分区索引:SQL> create index sales_local_idx2 on sales_range(customer_id) local;索引已创建。
2.全局分区索引全局分区索引是对整个分区表建立的索引,然后再由Oracle对索引进行分区。
全局分区索引的各个分区之间不是相互独立的,索引分区与分区表之间也不是简单的一对一关系。
图10-5显示了全局分区索引与分区表的对应关系。
分区索引分区表图10-5 全局分区索引与分区表例如,下面的语句为分区表SALES_LIST创建全局分区索引:SQL> create index sales_global_part_idx2 on sales_list(customer_id)3 global partition by range(customer_id)4 (5 partition part1 values less than(300) tablespace space01,6 partition part2 values less than(maxvalue) tablespace space027 );索引已创建。
oracle 查询索引语句一、查询索引定义1. 查询Oracle数据库中所有的索引```SELECT index_name, table_name FROM all_indexes;```2. 查询指定表中的所有索引```SELECT index_name FROM all_indexes WHERE table_name = '表名';```3. 查询指定索引的定义```SELECT index_name, table_name, column_name FROM all_ind_columns WHERE index_name = '索引名';```4. 查询索引的类型```SELECT index_name, table_name, index_type FROM all_indexes;```5. 查询索引的存储方式```SELECT index_name, table_name, index_type, index_subpartition_name, index_partition_name FROM all_indexes;```二、查询索引状态与统计信息1. 查询索引的状态(有效/无效)```SELECT index_name, status FROM all_indexes;```2. 查询索引的使用情况(最后一次访问时间、读取次数等)```SELECT index_name, last_analyzed, num_rows, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes;```3. 查询索引的大小```SELECT index_name, table_name, index_type, ROUND(bytes/1024/1024, 2) AS size_mb FROM dba_segments WHERE segment_type = 'INDEX';```4. 查询索引的碎片化情况```SELECT index_name, table_name, index_type, blevel, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes; ```5. 查询索引的使用情况(是否被频繁访问)```SELECT index_name, table_name, user_reads, user_updates FROM all_indexes;```三、查询索引的相关约束1. 查询索引所属的表的主键约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'UNIQUE';```2. 查询索引所属的表的外键约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```3. 查询索引所属的表的唯一约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```4. 查询索引所属的表的检查约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```5. 查询索引所属的表的默认值约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```四、查询索引的相关操作1. 查询索引的创建语句```SELECT dbms_metadata.get_ddl('INDEX', '索引名') FROM dual; ```2. 查询索引的重建语句```SELECT 'ALTER INDEX ' || index_name || ' REBUILD;' FROM all_indexes;```3. 查询索引的重命名语句```SELECT 'ALTER INDEX ' || index_name || ' RENAME TO 新索引名;' FROM all_indexes;```4. 查询索引的删除语句```SELECT 'DROP INDEX ' || index_name || ';' FROM all_indexes;```5. 查询索引的禁用语句```SELECT 'ALTER INDEX ' || index_name || ' UNUSABLE;' FROM all_indexes;```五、查询索引的相关性能优化1. 查询索引是否需要重新构建```SELECT index_name, table_name, last_analyzed FROM all_indexes WHERE last_analyzed < SYSDATE - 30;```2. 查询未使用的索引```SELECT index_name, table_name FROM all_indexes WHERE status = 'VALID' AND (user_reads = 0 OR user_updates = 0); ```3. 查询索引碎片化严重的情况```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes WHERE blevel > 3;```4. 查询索引的大小是否过大```SELECT index_name, table_name, index_type, ROUND(bytes/1024/1024, 2) AS size_mb FROM dba_segments WHERE segment_type = 'INDEX' AND bytes/1024/1024 > 100;```5. 查询索引的选择性是否低```SELECT index_name, table_name, distinct_keys, num_rows, (distinct_keys/num_rows) AS selectivity FROM all_indexes WHERE selectivity < 0.1;```六、查询索引的相关性能统计1. 查询索引的读取次数与更新次数```SELECT index_name, table_name, user_reads, user_updates FROM all_indexes;```2. 查询索引的平均访问时间```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor, num_rows, (leaf_blocks/clustering_factor) AS avg_access_time FROM all_indexes;```3. 查询索引的存储效率```SELECT index_name, table_name, blevel, leaf_blocks,distinct_keys, clustering_factor, (leaf_blocks/clustering_factor) AS storage_efficiency FROM all_indexes;```4. 查询索引的选择性```SELECT index_name, table_name, distinct_keys, num_rows, (distinct_keys/num_rows) AS selectivity FROM all_indexes;```5. 查询索引的碎片率```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor, (leaf_blocks/clustering_factor) AS fragmentation FROM all_indexes;```以上是关于Oracle查询索引的一些常用语句,通过这些语句可以方便地查询索引的定义、状态、统计信息以及进行相关操作和性能优化。
一.索引介绍1.1 索引的创建语法:CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>ON <schema>.<table_name>(<column_name> | <expression> ASC | DESC,<column_name> | <expression> ASC | DESC,...)TABLESPACE <tablespace_name>STORAGE <storage_settings>LOGGING | NOLOGGINGCOMPUTE STATISTICSNOCOMPRESS | COMPRESS<nn>NOSORT | REVERSEPARTITION | GLOBAL PARTITION<partition_setting>相关说明1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression 时即“基于函数的索引”3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)4)STORAGE:可进一步设置表空间的存储参数5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)6)COMPUTE STATISTICS:创建新索引时收集统计信息7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区1.2 索引特点:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
oracle重建索引的方法在Oracle 数据库中,重建索引是一种优化数据库性能的方法之一。
索引的重建可以帮助数据库优化查询性能,减少碎片,提高查询效率。
以下是在Oracle 中重建索引的一般步骤:1. 查看索引状态:在执行重建索引之前,你可以查看索引的状态,以确定是否需要重建。
使用以下查询来获取索引的统计信息:```sqlSELECT index_name, table_name, table_owner, statusFROM dba_indexesWHERE table_owner = 'your_table_owner' AND table_name = 'your_table_name';```这将返回表中所有索引的信息,包括索引名称、表名称、所有者和状态等。
2. 禁用索引(可选):在进行索引重建之前,你可以选择禁用索引。
禁用索引可能会加快索引重建的过程。
使用以下语句禁用索引:```sqlALTER INDEX index_name NOPARALLEL;```在此语句中,`index_name` 是要禁用的索引名称。
3. 重建索引:使用`ALTER INDEX` 语句来重建索引。
重建索引的语法如下:```sqlALTER INDEX index_name REBUILD;```在此语句中,`index_name` 是要重建的索引名称。
4. 启用索引(可选):如果在第2步中禁用了索引,可以使用以下语句启用索引:```sqlALTER INDEX index_name PARALLEL;```在此语句中,`index_name` 是要启用的索引名称。
请注意,重建索引可能会导致数据库锁定和性能影响,因此在生产环境中建议在低负载时执行。
此外,重建索引的必要性取决于数据库的使用情况,有时候并不是每个索引都需要经常重建。
最好在进行此类维护任务之前,了解数据库性能和索引的使用情况,以确保执行这些操作是有益的。
oracle的索引类型
Oracle数据库中常见的索引类型包括:1. B树索引(B-tree Index):是Oracle 默认的索引类型,适用于等值查找和范围查找。
2. 唯一索引(Unique Index):确保索引列的值在表中是唯一的。
3. 聚集索引(Cluster Index):按照表的物理存储顺序进行索引,适用于频繁进行范围查找的列。
4. 位图索引(Bitmap Index):将索引列的不同值分组为位图,并对每个位图使用压缩算法,适用于低基数列(取值范围较小)。
5. 函数索引(Function-Based Index):基于表达式或函数的结果构建的索引,适用于计算、转换或覆盖列的查询。
6. 虚拟列索引(Virtual Column Index):基于虚拟列(由表达式计算而来)构建的索引。
7. 全文索引(Full-Text Index):适用于对文本数据进行全文搜索的场景。
8. 空间索引(Spatial Index):适用于对地理位置和空间数据进行查询和分析。
9. 哈希索引(Hash Index):根据哈希函数计算的值来构建索引,适用于等值查询的索引。
10. 反向索引(Reverse Key Index):逆序存储索引键的位模式,适合于高度并发且插入操作有序的情况。
需要根据具体业务和查询需求选择合适的索引类型,以提高查询性能。
oracle索引使用的原则Oracle索引是Oracle数据库中的一项重要功能,它通过加速查询操作,提高性能和效率,为应用程序提供更快更精确的数据检索功能。
然而,索引的使用也需要遵循一定的原则和规范。
本文将结合实际情况,从多个角度分析Oracle索引的使用原则,并给出具体的操作步骤和注意事项,以期能对读者有所启示和帮助。
一、了解索引的基本原理在使用Oracle索引之前,首先要了解索引的基本原理。
在Oracle数据库中,索引是一种特殊的数据结构,它通过保存相应列的特定的排序信息,从而加快数据的检索速度。
一般来说,索引可以分为唯一索引和非唯一索引两种类型。
唯一索引要求列中的值必须唯一,非唯一索引则不要求。
此外,还可以创建聚集索引和非聚集索引。
聚集索引是根据表数据本身的排列顺序来创建的索引,而非聚集索引则不是。
二、确定索引的创建方式和范围在创建Oracle索引之前,需要先确定索引的创建方式和范围。
索引的创建方式主要包括手动和自动两种方式。
手动创建索引需要对相应的列进行DDL操作,自动创建索引则是由Oracle数据库自动实现的。
此外,还要根据实际需要确定索引的范围。
Oracle索引分为单列索引、多列联合索引和函数索引等多种类型,需要根据具体情况进行选择。
三、注意索引的设计和使用方式在设计和使用Oracle索引时,需要注意以下几点:1、避免创建过多的索引。
过多的索引会占用大量的存储空间,降低数据库的性能。
2、尽可能使用非聚集索引。
由于聚集索引需要按照表数据本身的排列顺序来创建,因此容易产生磁盘碎片,反而会降低查询效率。
3、遵循最左原则。
多列联合索引的顺序很重要,一般来说,对查询条件最常使用的列放在最左侧。
4、避免对大字段进行索引。
对大字段进行索引会增加磁盘I/O 的负担,从而降低性能。
5、避免在频繁更新的列上创建索引。
频繁的数据更新会导致索引失效,降低查询效率。
四、定期维护和优化索引除了正确使用Oracle索引之外,还需要进行定期维护和优化工作,以保证索引的高效性和稳定性。
详细解读索引
Oracle提供了大量索引选项。
知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。
一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。
而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。
这篇文章就将简单的讨论每个索引选项。
主要有以下内容:
[1] 基本的索引概念
查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。
访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
[2] 组合索引
当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。
在Oracle9i 引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。
比如:表emp 有一个组合索引键,该索引包含了empno、ename和deptno。
在Oracle9i之前除非在where 之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。
特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引!
[3] ORACLE ROWID
通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。
ROWID其实就是直接指向单独行的线路图。
如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。
[4] 限制索引
限制索引是一些没有经验的开发人员经常犯的错误之一。
在SQL中有很多陷阱会使一些索引无法使用。
下面讨论一些常见的问题:
4.1 使用不等于操作符(<>、!=)
下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。
select cust_Id,cust_name
from customers
where cust_rating <> 'aa';
把上面的语句改成如下的查询语句,这样,在采用基于规则的
优化器而不是基于代价的优化器(更智能)时,将会使用索引。
select cust_Id,cust_name
from customers
where cust_rating < 'aa' or cust_rating > 'aa';
特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
4.2 使用IS NULL 或IS NOT NULL
使用IS NULL 或IS NOT NULL同样会限制索引的使用。
因为NULL值并没有被定义。
在SQL语句中使用NULL会有很多的麻烦。
因此建议开发人员在建表时,把需要索引的列设成NOT NULL。
如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在详细讨论)。
4.3 使用函数
如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
下面的查询不会使用索引(只要它不是基于函数的索引)select empno,ename,deptno
from emp
where trunc(hiredate)='01-MAY-81';
把上面的语句改成下面的语句,这样就可以通过索引进行查找。
select empno,ename,deptno
from emp
where hiredate<(to_date('01-MAY-81')+0.9999);
4.4 比较不匹配的数据类型
比较不匹配的数据类型也是比较难于发现的性能问题之一。
注意下面查询的例子,account_number是一个V ARCHAR2类型,
在account_number字段上有索引。
下面的语句将执行全表扫描。
select bank_name,address,city,state,zip
from banks
where account_number = 990354;
Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了
索引的使用,改成下面的查询就可以使用索引:
select bank_name,address,city,state,zip
from banks
where account_number ='990354';
特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次“全表扫描”。
[5] 选择性
使用USER_INDEXES视图,该视图中显示了一个distinct_keys列。
比较一下唯一键的数量和表中的行数,就可以判断索引的选择性。
选择性越高,索引返回的数据就越少。
[6] 群集因子(Clustering Factor)
Clustering Factor位于USER_INDEXES视图中。
该列反映了数据相对于已索引的列是否显得有序。
如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目,表中的数据就越有序。
如果它的值接近于表中的行数,则表中的数据就不是很有序。
[7] 二元高度(Binary height)
索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。
在对一个索引进行分析后,可以通过查询DBA_INDEXES的B- level列查看它的二元高度。
二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。
索引上如果有大量被删除的行,它的二元高度也会增加。
更新索引列也类似于删除操作,因为它增加了已删除键的数目。
重建索引可能会降低二元高度。
[8] 快速全局扫描
在Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。
这个选项允许Oracle执行一个全局索引扫描操作。
快速全局扫描读取B-树索引上所有树叶块。
初始化文件中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。
[9] 跳跃式扫描
从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。
索引跳跃式扫描比全索引扫描要快的多。
下面的程序清单显示出性能的差别:
create index skip1 on emp5(job,empno);
index created.
select count(*)
from emp5
where empno=7900;
Elapsed:00:00:03.13
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=4 Card=1 Bytes=5)
1 0 SORT(AGGREGATE)
2 1 INDEX(FAST FULL SCAN) OF 'SKIP1'(NON-UNIQUE)
Statistics
6826 consistent gets
6819 physical reads
select /*+ index(emp5 skip1)*/ count(*)
from emp5
where empno=7900;
Elapsed:00:00:00.56
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE(Cost=6 Card=1 Bytes=5)
1 0 SORT(AGGREGATE)
2 1 INDEX(SKIP SCAN) OF 'SKIP1'(NON-UNIQUE)
Statistics
21 consistent gets
17 physical reads
[10] 索引的类型
B-树索引
位图索引
HASH索引
索引编排表
反转键索引
基于函数的索引
分区索引
本地和全局索引。