OracleBtree、位图、全文索引三大索引性能比较及优缺点汇总分析
oracle索引底层原理

oracle索引底层原理Oracle索引是一种特殊的数据结构,用于加速数据库的搜索和匹配操作。
在Oracle中,索引分为B-Tree、位图、函数和全文索引等类型,每种类型的索引都有自己的优点和局限性。
其中,B-Tree索引被广泛应用于Oracle数据库中,因为它简单易用,效率高。
B-Tree索引的底层原理是通过将数据库表的某个字段按照一定的规则切分成多个块,然后将每个块分别保存到B-Tree数据结构中的相应位置。
每个块的大小通常为一页,因此每个B-Tree节点也会被称为一页。
B-Tree树的根节点保存了整个索引的所有块的位置,而叶节点保存了块的实际内容。
B-Tree中每个节点都按照一定的顺序存储键值和指针。
当数据库执行查询操作时,它可以利用B-Tree索引快速定位到对应的块。
具体来说,查询操作首先从根节点开始,按照索引列的规则比较搜索键值与根节点中存储的键值,然后根据比较结果进一步搜索下一个子节点,直到搜索到叶子节点为止。
最后,数据库可以在叶子节点中查找到查询所需的数据。
B-Tree索引的优点是它可以快速定位到所需的数据块,同时还支持范围查询和排序等操作。
但是,B-Tree索引的局限性也很明显。
例如,当数据库表中的数据均匀分布时,B-Tree索引的效率会更高;但是,当数据不均匀分布时,B-Tree索引的效率会受到影响,因为大部分查询都会落在同一个块中。
此外,B-Tree索引只适用于单一列的查询,如果需要进行多列查询,则需要建立联合索引。
但是,联合索引可能导致索引过度冗余,影响效率。
除了B-Tree索引之外,Oracle还提供了其他类型的索引,如位图索引、函数索引和全文索引。
位图索引是一种适用于高度重复数据的索引类型,它将某个字段的值映射到一个位图中,然后利用位图进行查询。
函数索引可以加速特定的函数查询,如“Whereupper(username)=‘ADMIN’”。
全文索引适用于文本信息的查询,如文章标题或内容的检索。
位图索引与B-tree 索引

DBA:性能与可用性位图索引与B-tree 索引:选择与时间Vivek Sharma了解每个索引的正确应用对性能会有很大影响。
一般认为,位图索引最适合于具有低相异值的列(如GENDER、MARITAL_STATUS 和RELATION)。
然合,这种观点并不完全正确。
实际上,对于那些并不经常由许多并行系统更新其数据的系统来说,总是建议采用位图索引。
事实上,正如我此处所阐明的,在具有100% 唯一值(主键的列候选键)的列上的位图索引与B-tree 索引同样有效。
在本文中,我将提供一些示例和优化程序决策,它们对于低基数列和高基数列上的索引类型是通用的。
这些示例将帮助DBA 了解位图索引的使用实际上并不依赖于基数,而是依赖于应用程序。
比较索引在唯一列上使用位图索引(Oracle 不建议这种方法)有几个缺点,其中一个对充足空间的需求。
然而,位图索引的大小依赖于列的基数,位图索引是在该列上创建,同时进行数据分配。
因此,GENDER 列上的位图索引将小于相同列上的B-tree 索引。
相反,EMPNO(主键的候选键)上的位图索引将比此列上的B-tree 索引大得多。
但是因为访问决策支持系统(DSS) 的用户比访问交易处理(OLTP) 系统的用户要少,所以资源对于这些应用程序不是问题。
为演示这一点,我创建了两个表TEST_NORMAL 和TEST_RANDOM。
我使用PL/SQL 块在TEST_NORMAL 表中插入一百万行,然后随机在TEST_RANDOM 表中插入这些行:Create table test_normal (empno number(10), ename varchar2(30), sal number(10));BeginFor i in 1..1000000LoopInsert into test_normalvalues(i, dbms_random.string('U',30), dbms_random.value(1000,7000));If mod(i, 10000) = 0 thenCommit;End if;End loop;End;/Create table test_randomasselect /*+ append */ * from test_normal order by dbms_random.random;SQL> select count(*) "Total Rows" from test_normal;Total Rows----------1000000Elapsed: 00:00:01.09SQL> select count(distinct empno) "Distinct Values" from test_normal;Distinct Values---------------1000000Elapsed: 00:00:06.09SQL> select count(*) "Total Rows" from test_random;Total Rows----------1000000Elapsed: 00:00:03.05SQL> select count(distinct empno) "Distinct Values" from test_random;Distinct Values---------------1000000Elapsed: 00:00:12.07注意TEST_NORMAL 是条理的,而TEST_RANDOM 表是随机创建的,因此TEST_RANDOM 表的数据是无条理的。
oracle索引原理详解

oracle索引原理详解Oracle数据库中的索引是用于提高数据检索速度的重要工具。
了解Oracle索引的原理对于数据库管理员和开发人员来说是非常重要的。
一、索引的基本概念索引是Oracle数据库中的一个对象,它可以帮助数据库系统更快地检索数据。
索引类似于书籍的目录,可以快速定位到所需的数据。
二、索引的分类1. B-Tree索引:这是Oracle中最常用的索引类型,基于平衡多路搜索树(B-Tree)实现。
B-Tree索引适用于大多数数据类型,包括字符、数字和日期等。
2. Bitmap索引:位图索引主要用于处理包含大量重复值的列。
通过位图索引,可以更高效地处理这些列的查询。
3. 函数基索引:函数基索引允许在列上应用函数,然后对该结果进行索引。
这可以用于优化包含函数操作的查询。
4. 反转键索引:反转键索引是一种特殊类型的B-Tree索引,用于优化插入操作。
通过反转键顺序,可以更高效地处理插入操作。
三、索引的创建和维护1. 创建索引:创建索引的基本语法是“CREATE INDEX index_name ON table_name (column_name)”。
其中,index_name是索引的名称,table_name是要创建索引的表名,column_name是要索引的列名。
2. 维护索引:定期维护索引可以确保其性能和可靠性。
常用的维护操作包括重建索引(REBUILD INDEX)和重新组织索引(ORGANIZE INDEX)。
四、索引的优点和缺点1. 优点:使用索引可以显著提高数据检索速度,减少查询时间。
此外,索引还可以用于优化复杂查询的性能。
2. 缺点:虽然索引可以提高性能,但它们也会占用额外的磁盘空间。
此外,当表中的数据发生变化时,索引也需要更新,这可能会影响写操作的性能。
五、最佳实践1. 在经常用于搜索和排序的列上创建索引。
2. 根据查询模式和数据分布选择合适的索引类型。
3. 定期分析和维护索引,确保其性能和可靠性。
(转)数据库BTree索引、Hash索引、Bitmap位图索引的优缺点

(转)数据库BTree索引、Hash索引、Bitmap位图索引的优缺点测试于:MySQL 5.5.25当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型,默认为BTree。
Oracle或其他类型数据库中会有Bitmap索引(位图索引),这⾥作为⽐较也⼀起提供。
BTree索引BTree(多路搜索树,并不是⼆叉的)是⼀种常见的数据结构。
使⽤BTree结构可以显著减少定位记录时所经历的中间过程,从⽽加快存取速度。
按照翻译,B 通常认为是Balance的简称。
这个数据结构⼀般⽤于数据库的索引,综合效率较⾼。
——百度百科不适合:单列索引的列不能包含null的记录,复合索引的各个列不能包含同时为null的记录,否则会全表扫描;不适合键值较少的列(重复数据较多的列);前导模糊查询不能利⽤索引(like '%XX'或者like '%XX%')Hash散列索引Hash散列索引是根据HASH算法来构建的索引。
虽然 Hash 索引效率⾼,但是 Hash 索引本⾝由于其特殊性也带来了很多限制和弊端,主要有以下这些。
适合:精确查找⾮常快(包括= <> 和in),其检索效率⾮常⾼,索引的检索可以⼀次定位,不像BTree 索引需要从根节点到枝节点,所以Hash 索引的查询效率要远⾼于 B-Tree 索引。
不适合:不适合模糊查询和范围查询(包括like,>,<,between……and等),由于 Hash 索引⽐较的是进⾏ Hash 运算之后的 Hash 值,所以它只能⽤于等值的过滤,不能⽤于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的⼤⼩关系,并不能保证和Hash运算前完全⼀样;不适合排序,数据库⽆法利⽤索引的数据来提升排序性能,同样是因为Hash值的⼤⼩不确定;复合索引不能利⽤部分索引字段查询,Hash 索引在计算 Hash 值的时候是组合索引键合并后再⼀起计算 Hash 值,⽽不是单独计算Hash 值,所以通过组合索引的前⾯⼀个或⼏个索引键进⾏查询的时候,Hash 索引也⽆法被利⽤。
oracle索引的结构

oracle索引的结构Oracle索引的结构引言:在数据库管理系统中,索引是一种用于提高数据库查询性能的数据结构。
Oracle作为一种关系型数据库管理系统,也提供了索引的功能。
本文将介绍Oracle索引的结构及其作用。
一、概述索引是数据库中的一种数据结构,它能够加快查询速度和提高数据检索的效率。
在Oracle中,索引的结构主要有B树索引、位图索引和哈希索引。
二、B树索引B树索引是Oracle中最常用的索引结构之一。
它是一种平衡树结构,能够快速定位到指定的数据块。
B树索引的特点是高效的查询性能和较小的索引维护成本。
B树索引适用于范围查询和等值查询。
三、位图索引位图索引是一种基于位图的索引结构,它将索引的值映射为位图,每个位代表一个数据块的存在或缺失。
位图索引适用于数据分布相对均匀的列,例如性别、状态等。
它的优势是占用空间小,但对于数据更新较频繁的表,位图索引的维护成本较高。
四、哈希索引哈希索引是将索引的值通过哈希函数映射为一个唯一的哈希码,然后将哈希码作为索引。
哈希索引适用于等值查询,但不适用于范围查询。
哈希索引的优势是查询速度快,但它对于数据分布不均匀的列效果不佳。
五、索引的使用在使用索引时,需要根据具体的业务场景和数据特点选择合适的索引类型。
一般来说,对于频繁进行范围查询的列,可以使用B树索引;对于数据分布相对均匀的列,可以使用位图索引;对于等值查询较多的列,可以使用哈希索引。
六、索引的创建和维护在Oracle中,可以使用CREATE INDEX语句创建索引。
创建索引时需要考虑索引的列、表空间、索引类型等参数。
此外,索引的维护也是很重要的,可以使用ALTER INDEX语句对索引进行重建或重新命名。
七、索引的优化为了进一步提高查询性能,可以考虑对索引进行优化。
例如,可以使用索引覆盖来避免回表操作;可以使用索引合并来减少索引的数量;可以使用索引分区来提高查询效率等。
八、索引的注意事项在使用索引时,需要注意以下几点:1. 不要过度使用索引,过多的索引会增加数据库的维护成本。
oracle的索引类型

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):逆序存储索引键的位模式,适合于高度并发且插入操作有序的情况。
需要根据具体业务和查询需求选择合适的索引类型,以提高查询性能。
数据库索引的各种类型及适用场景
数据库索引的各种类型及适用场景数据库索引是提高数据库查询性能的重要手段,它可以加快数据的检索速度,在实际应用中扮演着关键的角色。
不同类型的索引适用于不同的场景,了解各种索引的特点和适用场景可帮助我们优化数据库性能,提高数据访问效率。
1. B-Tree索引:B-Tree索引是最常见的索引类型,适用于等值查找和范围查找,并且可以用于排序。
B-Tree索引可以在log(n)时间内进行查找操作,以根节点为起点,通过分支层层查找直到找到目标数据。
B-Tree索引适用于在大量数据中进行范围查询的场景,例如按日期或者价格范围进行查询。
同时,B-Tree索引也适用于根据唯一键进行等值查询的场景。
2. Hash索引:Hash索引是通过哈希函数将索引的键值转化为哈希码,然后将这个哈希码与哈希桶的地址相关联。
通过哈希码查找数据的过程非常快速,时间复杂度是O(1)。
然而,Hash索引只适用于等值查询,并且无法用于排序或范围查询。
Hash索引适用于在大数据集中进行精确查询的场景,例如根据用户ID进行查询。
3. 全文索引:全文索引用于对文本数据进行搜索,并能够有效地找到包含查询关键词的文档。
全文索引技术通过构建倒排索引,为每个文档创建一个包含关键词的列表。
在查询时,全文索引能够快速地匹配关键词。
全文索引适用于对大量文本数据进行关键词搜索的场景,例如新闻网站或博客平台。
4. 聚集索引:聚集索引是对数据行进行聚集排序并存储的索引。
聚集索引的叶节点中包含了完整的数据行,因此可以直接访问索引的叶节点即可获取数据。
每个表只能有一个聚集索引。
聚集索引适用于按照特定顺序对数据进行频繁访问的场景,例如某个日期范围内的订单查询。
5. 非聚集索引:与聚集索引不同,非聚集索引的叶节点并不包含完整的数据行,而是包含索引列和指向数据行的指针。
一张表可以有多个非聚集索引。
非聚集索引适用于需要频繁按照非聚集索引列进行查询的场景,例如根据商品名称或者客户姓名进行查询。
oracle 索引组织形式
oracle 索引组织形式Oracle索引是一种用于提高数据库查询性能的重要工具,可以根据不同的需求和数据特点采用不同的索引组织形式。
本文将介绍几种常见的Oracle索引组织形式,并对其特点和适用场景进行详细说明。
一、B树索引B树索引是最常见和最常用的索引组织形式之一。
它采用平衡树的结构,将数据按照键值的大小有序地存储在索引树中。
B树索引的特点是查询速度快,适用于等值查询和范围查询。
B树索引适用于数据量较大的表,能够提供较好的查询性能。
二、位图索引位图索引是一种适用于高并发查询的索引组织形式。
它将每个索引列的不同取值用一个位图来表示,其中每一位对应一个数据块或者一个行,用于表示该行是否包含该取值。
位图索引适用于数据量较小但并发查询较多的表,能够提供较好的查询性能。
三、哈希索引哈希索引是一种将索引键的值通过哈希函数计算得到一个固定的哈希码,然后根据哈希码来定位数据的索引结构。
哈希索引适用于等值查询,但不适用于范围查询。
哈希索引适用于数据分布均匀的表,能够提供较好的查询性能。
四、索引组织表索引组织表是一种将数据和索引存储在同一个结构中的索引组织形式。
它通过将数据行按照索引键的顺序存储在磁盘上,以提高查询性能。
索引组织表适用于查询频繁但更新较少的表,能够提供较好的查询性能。
五、函数索引函数索引是一种对索引列进行函数操作后建立的索引。
它适用于对索引列进行函数操作的查询,能够提高查询性能。
函数索引适用于数据量较大且需要进行函数操作的表,能够提供较好的查询性能。
六、全文索引全文索引是一种对文本内容进行索引的特殊索引组织形式。
它适用于对文本内容进行全文检索的查询,能够提供较好的查询性能。
全文索引适用于包含大量文本内容的表,能够提供较好的查询性能。
不同的索引组织形式适用于不同的查询需求和数据特点。
在实际应用中,我们应根据具体情况选择合适的索引组织形式,以提高数据库查询性能。
同时,我们还需要注意索引的创建和维护,避免过多或过少的索引对性能产生负面影响。
oracle 索引 总结
oracle 索引总结Oracle索引是数据库中一种重要的数据结构,用于提高数据库的查询效率和性能。
本文将从索引的定义、使用场景、优缺点以及索引的创建和管理等方面进行总结。
一、索引的定义索引是数据库中的一种数据结构,它类似于书籍的目录,可以加快数据库的查询速度。
通过索引,数据库可以快速定位到存储在表中的特定数据行,而无需遍历整个表。
二、索引的使用场景1. 高效查询:当数据库中的表中包含大量数据时,通过创建索引可以提高查询效率,减少查询所需的时间。
2. 唯一性约束:索引可以用于唯一性约束,保证表中的某一列的值唯一。
3. 外键约束:索引可以用于外键约束,保证表与表之间的关联关系的完整性。
4. 排序和分组:索引可以用于排序和分组操作,提高排序和分组的效率。
5. 加速数据更新:索引可以加速数据的插入、更新和删除操作,提高数据库的写入性能。
三、索引的优缺点1. 优点:- 提高查询速度:通过索引可以快速定位到所需数据,减少数据库的扫描时间。
- 提高系统性能:索引可以减少数据库的I/O操作,提高系统的整体性能。
- 保证数据的完整性:索引可以用于唯一性约束和外键约束,保证数据的完整性。
2. 缺点:- 占用存储空间:索引会占用一定的存储空间,特别是对于大表来说,索引可能会占用较大的空间。
- 增加写入开销:当进行数据的插入、更新和删除操作时,索引也需要进行相应的更新,增加了写入的开销。
- 增加索引维护成本:索引需要进行维护和管理,包括创建、删除、重建等操作,增加了数据库管理员的工作量。
四、索引的创建和管理1. 创建索引:可以使用CREATE INDEX语句来创建索引,语法如下: ```CREATE INDEX index_name ON table_name (column1, column2, ...);```其中,index_name是索引的名称,table_name是要创建索引的表名,column1、column2等是要创建索引的列名。
Oracle索引用法大总结,好处与坏处,优点与缺
Oracle索引用法大总结,好处与坏处,优点与缺点二索引使用的好处与坏处(Oracle)分类:OracleDB创建索引的好处–帮助用户提高查询速度–利用索引的唯一性来控制记录的唯一性–可以加速表与表之间的连接–降低查询中分组和排序的时间创建索引的坏处–存储索引占用磁盘空间–执行数据修改操作(INSERT、UPDATE、DELETE)产生索引维护----------------------------------------------------------------------------------------------索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高10000倍,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能。
索引的管理成本1、存储索引的磁盘空间2、执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护3、在数据处理时回需额外的回退空间。
实际数据修改测试:一个表有字段A、B、C,同时进行插入10000行记录测试在没有建索引时平均完成时间是2.9秒在对A字段建索引后平均完成时间是6.7秒在对A字段和B字段建索引后平均完成时间是10.3秒在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒从以上测试结果可以明显看出索引对数据修改产生的影响索引按存储方法分类B*树索引B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。
一般索引及唯一约束索引都使用B*树索引。
位图索引位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。
位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
引言:大家都知道“效率”是数据库中非常重要的一个指标,如何提高效率大家可能都会想起索引,但索引又这么多种,什么场合应该使用什么索引呢?哪种索引可以提高我们的效率,哪种索引可以让我们的效率大大降低(有时还不如全表扫描性能好)下面要讲的“索引”如何成为我们的利器而不是灾难!多说一点,由于不同索引的存储结构不同,所以应用在不同组织结构的数据上,本篇文章重点就是:理解不同的技术都适合在什么地方应用!B-Tree索引场合:非常适合数据重复度低的字段例如身份证号码手机号码 QQ号等字段,常用于主键唯一约束,一般在在线交易的项目中用到的多些。
原理:一个键值对应一行(rowid)格式:【索引头|键值|rowid】优点:当没有索引的时候,oracle只能全表扫描where qq=40354446 这个条件那么这样是灰常灰常耗时的,当数据量很大的时候简直会让人崩溃,那么有个B-tree索引我们就像翻书目录一样,直接定位rowid 立刻就找到了我们想要的数据,实质减少了I/O操作就提高速度,它有一个显著特点查询性能与表中数据量无关,例如查2万行的数据用了3 consistent get,当查询1200万行的数据时才用了4 consistent gets。
当我们的字段中使用了主键or唯一约束时,不用想直接可以用B-tree索引缺点:不适合键值重复率较高的字段上使用,例如第一章1-500page 第二章501-1000page实验:alter system flush shared_pool; 清空共享池alter system flush buffer_cache; 清空数据库缓冲区,都是为了实验需要创建leo_t1 leo_t2 表leo_t1 表的object_id列的数据是没有重复值的,我们抽取了10行数据就可以看出来了。
LS@LEO> create table leo_t1 as select object_id,object_name from dba_objects;LS@LEO> select count(*) from leo_t1;COUNT(*)----------9872LS@LEO> select * from leo_t1 where rownum <= 10;OBJECT_ID OBJECT_NAME---------- -----------20 ICOL$44 I_USER128 CON$15 UNDO$29 C_COBJ#3 I_OBJ#25 PROXY_ROLE_DATA$39 I_IND151 I_CDEF226 I_PROXY_ROLE_DATA$_1leo_t2 表的object_id列我们是做了取余操作,值就只有0,1两种,因此重复率较高,如此设置为了说明重复率对B树索引的影响LS@LEO> create table leo_t2 as select mod(object_id,2) object_ID ,object_name from dba_objects;LS@LEO> select count(*) from leo_t2;COUNT(*)----------9873LS@LEO> select * from leo_t2 where rownum <= 10;OBJECT_ID OBJECT_NAME---------- -----------0 ICOL$0 I_USER10 CON$1 UNDO$1 C_COBJ#1 I_OBJ#1 PROXY_ROLE_DATA$1 I_IND11 I_CDEF20 I_PROXY_ROLE_DATA$_1LS@LEO> create index leo_t1_index on leo_t1(object_id); 创建B-tree索引,说明默认创建的都是B-tree索引Index created.LS@LEO> create index leo_t2_index on leo_t2(object_ID); 创建B-tree索引Index created.让我们看一下leo_t1与leo_t2的重复情况LS@LEO> select count(distinct(object_id)) from leo_t1; 让我们看一下leo_t1与leo_t2的重复情况,leo_t1没有重复值,leo_t2有很多COUNT(DISTINCT(OBJECT_ID))--------------------------9872LS@LEO> select count(distinct(object_ID)) from leo_t2;COUNT(DISTINCT(OBJECT_ID))--------------------------2收集2个表统计信息LS@LEO> execute dbms_stats.gather_table_stats(ownname=>'LS',tabname=>'LEO_T1',method_opt=>'for all indexed columns size 2',cascade=>TRUE);LS@LEO> execute dbms_stats.gather_table_stats(ownname=>'LS',tabname=>'LEO_T2',method_opt=>'for all indexed columns size 2',cascade=>TRUE);参数详解:method_opt=>'for all indexed columns size 2' size_clause=integer 整型,范围1~254 ,使用柱状图[ histogram analyze ]分析列数据的分布情况cascade=>TRUE 收集表的统计信息的同时收集B-tree索引的统计信息显示执行计划和统计信息+设置autotrace简介序号命令解释1 SET AUTOTRACE OFF 此为默认值,即关闭Autotrace2 SET AUTOTRACE ON EXPLAIN 只显示执行计划3 SET AUTOTRACE ON STATISTICS 只显示执行的统计信息4 SET AUTOTRACE ON 包含2,3两项内容5 SET AUTOTRACE TRACEONLY 与ON相似,但不显示语句的执行结果结果键值少的情况set autotrace trace exp stat; (SET AUTOTRACE OFF 关闭执行计划和统计信息)LS@LEO> select * from leo_t1 where object_id=1;no rows selectedExecution Plan 执行计划----------------------------------------------------------Plan hash value: 3712193284--------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 21 | 2 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID| LEO_T1 | 1 | 21 | 2 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN索引扫描 | LEO_T1_INDEX | 1 | | 1 (0)| 00:00:01 |-------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):---------------------------------------------------2 - access("OBJECT_ID"=1)Statistics 统计信息----------------------------------------------------------0 recursive calls0 db block gets2 consistent gets 我们知道leo_t1表的object_id没有重复值,因此使用B-tree索引扫描只有2次一致性读0 physical reads0 redo size339 bytes sent via SQL*Net to client370 bytes received via SQL*Net from client1 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)0 rows processed结果键值多的情况LS@LEO> select * from leo_t2 where object_ID=1; (select /*+full(leo_t2) */ * from leo_t2 where object_ID=1;hint方式强制全表扫描)4943 rows selected.Execution Plan 执行计划----------------------------------------------------------Plan hash value: 3657048469----------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 4943 | 98860 | 12 (0)| 00:00:01 ||* 1 | TABLE ACCESS FULL| LEO_T2 | 4943 | 98860 | 12 (0)| 00:00:01 | sql结果是4943row,那么全表扫描也是4943row----------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("OBJECT_ID"=1)Statistics 统计信息----------------------------------------------------------1 recursive calls0 db block gets366 consistent gets 导致有366次一致性读0 physical reads0 redo size154465 bytes sent via SQL*Net to client4000 bytes received via SQL*Net from client331 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)4943 rows processed大家肯定会疑惑,为什么要用全表扫描而不用B-tree索引呢,这是因为oracle基于成本优化器CBO认为使用全表扫描要比使用B-tree索引性能更好更快,由于我们结果重复率很高,导致有366次一致性读,从cup使用率12%上看也说明了B-tree索引不适合键值重复率较高的列我们在看一下强制使用B-tree索引时,效率是不是没有全表扫描高呢?LS@LEO> select /*+index(leo_t2 leo_t2_index) */ * from leo_t2 where object_ID=1; hint 方式强制索引扫描4943 rows selected.Execution Plan 执行计划----------------------------------------------------------Plan hash value: 321706586--------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 4943 | 98860 | 46 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| LEO_T2 | 4943 | 98860 | 46 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN | LEO_T2_INDEX | 4943 | | 10 (0)| 00:00:01 |-------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):---------------------------------------------------2 - access("OBJECT_ID"=1)Statistics 统计信息----------------------------------------------------------1 recursive calls0 db block gets704 consistent gets 使用B-tree索引704次一致性读> 全表扫描366次一致性读,而且cpu 使用率也非常高,显然效果没有全表扫描高0 physical reads0 redo size171858 bytes sent via SQL*Net to client4000 bytes received via SQL*Net from client331 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)4943 rows processed小结:从以上的测试我们可以了解到,B-tree索引在什么情况下使用跟键值重复率高低有很大关系的,之间没有一个明确的分水岭,只能多测试分析执行计划后来决定。