首页 > 编程知识 正文

oracle indexof函数,oracle 不走索引

时间:2023-05-06 10:45:47 阅读:110646 作者:2116

今天,整理ORACLE索引时,ORACLE索引有很多类型。 例如,b树索引(默认类型)、位图索引、散列索引编制表索引逆变换键(reverse key基于索引函数的索引分区索引)、本地索引和辉光

今天整理ORACLE索引。 ORACLE索引有许多类型,包括:

b树索引(默认类型)

位图索引

散列索引

索引编制表索引

反转密钥索引

基于函数的索引

分区索引(本地和全局索引) ) ) ) ) ) ) )。

位图连接索引

今天主要整理oracle中最常见、使用最广泛的B树索引(默认类型)、位图索引,直接进入正文。

首先,理解要索引的语法。

createuniuqe|bitmap index.on.| ASC,

| ASC | DESC,)

表空间存储日志记录

计算机静态

无概念

分区

UNIUQE:创建唯一的索引。 要索引的列的值必须是唯一的

BITMAP :创建位图索引。 如果未指定,请创建b-tree(Oracle的缺省)索引

.指定索引名称

.指定应用索引的表的名称

:为哪些列创建索引

TABLESPACE:指定表所在的表空间

STORAGE :可以设置表空间的更多参数

logging :索引是否重做日志

COMPUTE STATISTICS :创建新索引时收集统计信息

no compress :是否使用密钥压缩(密钥压缩会删除密钥中的重复值,减少存储空间使用量,同时降低效率)

NOSORT :表示索引的编制顺序与表相同,REVERSE表示索引值的存储顺序相反

分区:用于对在分区表或非分区表中创建的索引进行分区

示例创建test2表的默认B-tree索引

createindext _ name _ indexontest2(name ) -其他项目的默认值

B-TREE索引创建成功! 就这么简单。 那么,B-tree是什么? 往下看

什么是B-tree索引?

B-tree索引最常见的类型,也是oracle的默认类型。 B树索引是使用平衡算法管理索引的平衡树。

B树索引是结构上倒立的树结构,有分支块和叶块两种数据块。 分支块的作用是根据条件查询定位其他分支块和叶块。

叶块是用于存储索引中的列值和相应数据行的物理地址。 此物理地址由rowid表示,rowid是指向数据行物理地址的指针。 这是oracle数据库

访问数据行的最快方法。 索引只存储索引的列值和rowid,而且比表的大小小得多,因此索引查询的速度远远快于表的搜索速度。

B-tree索引检索原理

例如,对于:查询ID为2199的记录,SELECT * FROM TEST WHERE ID=2199;

如果没有索引,则必须在所有表中扫描2199条记录。 目前,在ID列上创建B-tree索引并使用索引查询的原理步骤如下:

1、读取最上层的分支块数据,知道id为2199的记录的索引在第二层的分支块B3的锁定位的范围内。

2 .读出第2段分支块B3的数据,知道ID为2199的记录的索引列存储在第2段的分支块B3下的叶块B31中

3、读取叶块中的B31数据,获取id为2199的记录的rowid,获取rowid,获得该记录。

可以看到,在读取三个数据块之前,索引搜索数据远远少于在所有表中读取的数据数。 I/o操作数据大幅减少,提高了查询效率。

如果查询是不等查询,则不需要沿着从三级到顶级的分支块再次搜索,而是直接沿着双向链表执行查询,如下图代码所示。

select * fromtestwhereidbetween ' 2199 ' and ' 2999 ';

要此时查询记录,请执行以下操作:

1、读取最高层的分支块数据,得知id为2199的记录的索引列值处于第二层的分支块B3所在的范围内。

2、读取第二层B3的数据,知道ID为2199的记录索引列值存储在第二层分支块下的叶块B31中。

3、读取叶块B31的数据,获取ID为2199的rowid,基于rowid获取该记录。

4、沿叶块双向链表结构向后依次获取2999条记录rowid,根据rowid获取相应的记录。

对于索引,B-tree索引结

构思一个十分有效的数据结构,其层次通常很短,一般不会超过三层,在一个千万数据级的表中查询一条记录,一般也只需读取

3个数据块。

当一条新数据插入表中,新的信息同时也被插入到叶块中;当一个叶块被写满后,被插入新的行信息叶块就会被分割为两个叶块,新的叶块定位信息就会被放入

上层分支块中;如果分支块也被写满,那么它也会自动分割为两个分支块,新的分支块地位信息同时放入到上层分支块中,以此类推直到全部信息写入各个级别

的分支块。在此过程中平衡算法会自动调整各个分支块所能定位的下级分支块和叶块的数量以及叶块中保存索引列值数量,以使各分支尽量达到平衡。

虽然B-tree索引应用最为广泛,但也不适用于所有情况,适用B树索引的场合有:

1、表中存储的数据库很多

2、列中存储的不同数据值很多

3、查询的数据量不超过全表的5%,否则应使用全表扫描

用于查看索引信息user_indexes:

select index_name,blevel+1,table_name from user_indexes; --blevel表示该索引有几个分支块,+1表示包含叶块数量

例子2:为test2表创建位图索引

CREATE BITMAP INDEX t_name_index on test2 (name) --test2表创建位图索引

虽然B-tree索引应用很广,但在一个列有多很多重复值时,B-TREE索引的叶块就会存储很多重复的数据,反而会影响数据查询效率。对于一个列中重复值很多时,

采用位图索引进行检索查询效率会更高。ORACLE创建位图索引时,会为索引创建一个位图,该位图由二进制数组成。0表示该列无值,1表示该列有值。

直接上例子:SELECT s_id,s_name,s_political,s_language from student;

sid s_name s_political s_language

0807020225 张三 共青团员 日语

0807020226 李四 共青团员 英语

0807020227 王五 群众 英语

0807020228 耍酷的睫毛 共青团员 英语

0807020229 开朗的冬瓜 共青团员 日语

0807020230 王八 预备党员 英语

0807070130 王八1 预备党员 英语

0807070201 王八2 党员 英语

如以s_political、s_language为条件查询,那么位图索引二进制表示为:

共青团员:11011000

群众: 00100000

预备党员:00000110

党员: 00000001

日语:10001000

英语:01110111

--以上是位图索引所表现的搜索方式,0表示该列无值,1表示该列有值。

假设要查询政治面貌是‘共青团员’语种是‘英语’的学生学号、姓名,可执行下面的语句:

SELECT S_ID,S_NAME,FROM STUDENT WHERE s_political='共青团员' and s_language='英语'

共青团员:11011000

英语: 01110111

共青团员和英语匹配为1的。那么记录为2,4

对于表列中重复数据很多时使用位图索引可以查询提高效率。当对表总进行增删改时会重新组织索引项,每个位图索引项都包含了表中大量数据行的rowid,因此对于频繁使用增删改操作

表不适用于使用位图索引。使用位图所有的场合有:

1、表中有大量数据存在

2、表中列有重复数值不少

3、列用于布尔运行(or,and,not);

查看索引信息

select * from user_indexes

有时创建了索引,但并没有比没索引查询速度高,这是因为索引中也存在一些自身的限制:

查看网络连接:http://blog.chinaunix.net/uid-24612962-id-3243307.html

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。