oracle索引

简介

1.说明

  1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。

  2)索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率

  3)索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表;

  4)索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响

  5)索引对用户是透明的,无论表上是否有索引,sql语句的用法不变

  6)oracle创建主键时会自动在该列上创建索引

 

索引原理

1.  若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍

2. 若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方

3.创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引

 

索引使用(创建、修改、删除、查看)

1.创建索引语法

复制代码
复制代码
CREATE [UNIQUE] | [BITMAP] INDEX index_name  --unique表示唯一索引
ON table_name([column1 [ASC|DESC],column2    --bitmap,创建位图索引
[ASC|DESC],…] | [express])
[TABLESPACE tablespace_name]
[PCTFREE n1]                                 --指定索引在数据块中空闲空间
[STORAGE (INITIAL n2)]
[NOLOGGING]                                  --表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用
[NOLINE]
[NOSORT];                                    --表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用
复制代码
复制代码

2.修改索引

1)重命名索引

alter index index_sno rename to bitmap_index;

2) 合并索引(表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,无需额外存储空间,代价较低)

alter index index_sno coalesce;

3)重建索引

  方式一:删除原来的索引,重新建立索引

  方式二:

alter index index_sno rebuild;

3.删除索引

drop index index_sno;

4.查看索引

复制代码
复制代码
select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';-- eg:    
create index index_sno on student('name');
select * from all_indexes where table_name='student';
复制代码
复制代码

 

索引分类

1. B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值)

1)说明:

  1.oracle中最常用的索引;B树索引就是一颗二叉树;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID值

  2.所有叶子节点具有相同的深度,因而不管查询条件怎样,查询速度基本相同

  3.能够适应精确查询、模糊查询和比较查询

2)分类:

   UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)

3)创建例子

craete index index_sno on student('sno');

 

4)适合使用场景:

  列基数(列不重复值的个数)大时适合使用B数索引

  

2. 位图索引

1)说明:

  1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建立一个位图(位图中,对表中每一行 使用一位(bit,0或者1)来标识该行是否包含该位图的索引列的取值,如果为1,表示对应的rowid所在的记录包含该位图索引列值),最后通过位图索 引中的映射函数完成位到行的ROWID的转换

2)创建例子

create bitmap index index_sno on student(sno);

3) 适合场景:

对于基数小的列适合简历位图索引(例如性别等)

 

3.单列索引和复合索引(基于多个列创建)

1) 注意:

  即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

 

4. 函数索引

1)说明:

  1. 当经常要访问一些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度

  2. 函数索引既可以使用B数索引,也可以使用位图索引;当函数结果不确定时采用B树索引,结果是固定的某几个值时使用位图索引

  3. 函数索引中可以水泥用len、trim、substr、upper(每行返回独立结果),不能使用如sum、max、min、avg等

 

2)例子:

create index fbi  on student (upper(name));
select * from student where upper(name) ='WISH';

 

索引建立原则总结

  1. 如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引

  2. 至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)

  3. 小表不要简历索引

  4. 对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引

  5. 列中有很多空值,但经常查询该列上非空记录时应该建立索引

  6. 经常进行连接查询的列应该创建索引

  7. 使用create index时要将最常查询的列放在最前面

  8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引

  9.限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)

注意事项

1. 通配符在搜索词首出现时,oracle不能使用索引,eg:

复制代码
复制代码
--我们在name上创建索引;create index index_name on student('name');--下面的方式oracle不适用name索引select * from student where name like '%wish%';--如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:select * from student where name like 'wish%';
复制代码
复制代码

 

 2. 不要在索引列上使用not,可以采用其他方式代替如下:(oracle碰到not会停止使用索引,而采用全表扫描)

复制代码
复制代码
select * from student where not (score=100);select * from student where score <> 100;--替换为select * from student where score>100 or score <100
复制代码
复制代码

 

3. 索引上使用空值比较将停止使用索引, eg:

select * from student where score is not null;

转载于:https://www.cnblogs.com/Soprano/p/10659424.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第八期:实操:两台路由器,如何分别通过WAN和LAN口连接?

两个路由器在一个网段内IP地址是一样的&#xff0c;两个路由器连接有两个DHCP服务器共同工作所以IP会产生冲突。下面我们来一起看下分别通过WAN口和LAN口怎么连接。 两个路由器在一个网段内IP地址是一样的&#xff0c;两个路由器连接有两个DHCP服务器共同工作所以IP会产生冲突。…

cognos10 安装部署

由于工作的原因&#xff0c;今天需要安装下cognos10&#xff0c;由于以前没有接触过IBM的这个产品&#xff0c;因此付出了一天时间的惨痛代价&#xff0c;写这篇文章的目的就是对cognos10的初学者安装部署时能少走弯路&#xff0c;各位cognos的大侠请多批评和指教&#xff0c;不…

GPLT2017题目

阅览室: L1-043. 阅览室 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时&#xff0c;管理员输入书号并按下S键&#xff0c;程序开始计时&#xff1b;当读者还书时&#…

Spring各jar包的作用(转载)

spring.jar是包含有完整发布的单个jar 包&#xff0c;spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容&#xff0c;因为只有在开发环境下才会用到 spring-mock.jar来进行辅助测试&#xff0c;正式应用系统中是用不得这些类的。 除了spring.jar文件&am…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第15篇]RSA-OAEP和ECIES的密钥生成,加密和解密

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇总是为了让博士生们在第一年结束时知道些什么。通过描述RSA-OAEP和ECIES的密钥生成、加密和解密算法&#xff0c;我们回到了"more crypto" staff …

第二十六期:HTTP 3的前世今生及尝鲜

HTTP/3又迎来一个里程碑&#xff1a;近日Cloudflare官方宣其边缘网络上已全面提供QUIC和HTTP/3支持。那么HTTP/3可以带来哪些变化和优势呢? 对Internet的用户&#xff0c;并且通过浏览器和其他客户端与站点进行高效交互。 HTTP/3又迎来一个里程碑&#xff1a;近日Cloudflare官…

业务时间做开发,使用jeecg框架

最近想在业余时间做一个项目管理的应用给自己用&#xff0c;但自己业余时间又不多&#xff0c;所以就想找一个不用重复写基本代码&#xff08;例如bean、dao、service、action的增删改查&#xff09;&#xff0c;不用重复写jsp代码。这样&#xff0c;我选择了jeecg。它基本满足…

前端中标签页的手写方法

虽然流行用框架写出来 这里也可以用手写方法写出来 也并不是这么复杂 首先为了实现如下效果的标签 我们可以在前端把两个表直接输出出来 <table class "tag char" id "tagf" ><tr><td>Found</td><td>Found time</td&…

Redis中的执行命令的过程

在redis.c的initServerConfig()方法中&#xff0c;通过调用dictCreate方法初始化server端的命令表。这个命令表是一个hashtable,可以通过key找到相关的命令&#xff1a; /* Command table -- we initiialize it here as it is part of the* initial configuration, since comma…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第16篇]描述DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。

这是一系列博客文章中最新的一篇&#xff0c;文章的主题是“做密码学每个博士生都应该知道的52件事”。这一系列问题是为了让博士生们在第一年结束时了解他们应该知道的事情。本周我们将介绍DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。 1.DSA 2.Schnorr 3.RSA-FDH Refe…

nutch2.1在windows平台上使用eclipsedebug 存储在mysql的搭建过程

步骤1&#xff1a;准备好eclipse、eclipse svn插件、mysql准备好&#xff0c;mysql使用utf-8编码 步骤2&#xff1a;mysql建库&#xff0c;建表&#xff1a; CREATEDATABASEnutch ; CREATE TABLE webpage (id varchar(767) NOT NULL,headers blob,text mediumtext DEFAULT NULL…

(转)分布式锁的几种使用方式(redis、zookeeper、数据库)

https://blog.csdn.net/u010963948/article/details/79006572转载于:https://www.cnblogs.com/Andrew520/p/10663350.html

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第17篇]述和比较DES和AES的轮结构

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。这周&#xff0c;我们描述和比较DES和AES轮结构。 DES和AES都是迭代分组密码的例子.分组密码通过重复使用一个…

nutch2.1分布式抓取

在上一篇的基础上。 1准备环境&#xff1a;hadoop集群、java、mysql数据库&#xff0c;代码可以在eclipse中运行&#xff0c;可以单机模式下插入数据到mysql数据库。2修改配置文件nutch-site.xml&#xff1a;<property><name>plugin.folders</name><value…

AtCoder-2379 - 连接竹竿 思维 | 数学

Problem Statement Snuke has N integers. Among them, the smallest is A, and the largest is B. We are interested in the sum of those N integers. How many different possible sums there are? Constraints 1≤N,A,B≤109A and B are integers. Input Input is given…

UML用例图

统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;又称标准建模语言&#xff0c;是始于1997年的一个OMG标准&#xff0c;它是一个支持模型化和软件系统开发的图形化语言&#xff0c;为软件开发的所有阶段提供模型化和可视化支持&#xff0c;包括由…

[剑指offer]面试题第[44]题[JAVA][数字序列中某一位的数字][找规律]

【问题描述】[中等] 【解答思路】 找规律 时间复杂度&#xff1a;O(logN) 空间复杂度&#xff1a;O(logN) class Solution {public int findNthDigit(int n) {int digit 1;long start 1;long count 9;while (n > count) { // 1.n - count;digit 1;start * 10;count di…

深度学习第五课-训练注意事项与框架使用

说明&#xff1a;本文是七月算法5月深度学习班第五次课听课笔记。黄色标注的部分为自己不太确定的部分。 训练 mini-batch SGD 神经网络使用mini-batch SGD训练得到最优权重。训练过程如下&#xff1a;&#xff08;以下参考了andrew ng的机器学习课程&#xff09;例如训练样本…

next_permutation算法(基于交换)

nextpermutation 算法 这个算法如何实现 我们要观察对于任意的123456 对于一个任意的字符串 我们如果要找他的下一个全排列 就应该变动其数字 使得其数值增大 且是最小的增大 那么仅使用以上数字 如何才能使其变大 但变大的数字 是所有变大范围内最小的可能 我们称其为 最小变大…

【Vue】【Router】手动跳转用 this.$router.push() 时 $router 未定义的问题

初入Vue&#xff0c;手写路由跳转时的问题&#xff1a; toXxxRoute: () > {this.$router.push({path: /xxx, name: xxx}) } 由于使用了箭头函数&#xff0c;this的指向与传统 js 里不同 所以报错 TypeError: Cannot read property $router of undefined 与其保持一个this变量…