度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1056|回复: 2
打印 上一主题 下一主题

[分享] oracle索引技术基本用法总结

[复制链接]

348

主题

3572

帖子

9328

积分

论坛元老

Rank: 8Rank: 8

积分
9328
跳转到指定楼层
楼主
发表于 2020-4-21 22:22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

作为一名开发人员,在做oracle应用开发的时候,最常用到的就是对表、视图的操作,可能有时候也会建立表间约束,但是对于oracle中的视图其实用到的并不是很多,哪怕很多表都被建了索引,但是一般这些都是数据库开发人员(如DBA)做好了,我们做开发的时候只要写写SQL、PL/SQL用用就好了。今天在网上看到虫师的一篇《oracle 索引》的文章,文章中基本上介绍了oracle索引的方方面面,也详细的对比了B-Tree索引和位图索引,我觉得这篇文章倒可以算作oracle索引的进阶教程了,感兴趣的可以去那篇文章中看一下,我在本文只想对oracle索引的基本用法做一个简单的总结。

1、oracle索引介绍

索引是一种与表有关的数据库对象,主要作用是加快数据的读取速度和完整性检查,一般在做应用开发的时候不会胡乱的增加或删除索引,因为索引的增减确实是个技术活,而且维护索引也是需要很大的代价,所以,索引一般都是在做数据库设计的时候一并设计好建立。通俗的说,索引可以看作是一本书的目录,当我想找书中的某一个内容是,首先进入目录,找到相应的子目录或者栏目,然后根据栏目页后面的页码找到对应的内容页,而索引也是如此,如果我想找某张表中的某一条记录,首先,进入索引,再进入索引的分支,然后进入分支下的叶子节点,根据叶子节点中的rowid找到相应的记录,因为每一条记录都有一个唯一的rowid。

下面有一个关于索引的例子,摘自虫师的博客:



对于上面这张图,根结点记录0到50条数据的位置,分支结点进行拆分记录0到10……42到50,叶子结点记录每条数据的长度和值,并由指针指向具体的数据。最后一层的叶子结点是双向链接,它们是被有序的链接起来,这样才能快速的锁定一个数据范围。

2、oracle索引的分类

(1)按逻辑分类

single column or concatenated:对一列或多列建索引。

unique or nonunique:唯一的和非唯一的索引,也就是对某一列或几列的键值是否是唯一的。

function-based:基于某些函数索引,当执行某些函数时需要对其进行计算,可以将某些函数的计算结果事先保存并加以索引,提高效率。

doman:索引数据库以外的数据,使用相对较少。

(2)按物理分类

B-Tree:B-Tree索引就是传统上常见的所理解的索引,它也可以分为正常索引和倒序索引。

Bitmap:位图索引。

3、oracle索引的创建

图2:索引创建规范

上图2是索引创建的一个规范,不过我一般写的简单,就直接类似:

  1. -- 基于一个列
  2. CREATE INDEX emp_last_name_idx
  3. ON employees(last_name);
  4. -- 基于多个列
  5. CREATE INDEX emp_last_name_age_idx
  6. ON employees(last_name, age);
复制代码

上面列出的是一种简单索引,还有一类常用的索引叫做函数索引,比如:


  1. CREATE INDEX emp_upper_last_name_idx
  2. ON employees(UPPER(last_name));
复制代码

如果employees表中存储的last_name英文大小不一,那么当我进行如下查询的时候,如果直接对last_name建立索引就无法调用到索引,所以为了满足下面的查询,我们建立上面的函数索引,查询语句如下:

  1. SELECT * FROM employees e WHERE UPPER(e.last_name) = 'YEDWARD';
复制代码

4、删除索引

删除索引的语句:

  1. DROP INDEX emp_upper_last_name_idx;
复制代码

对索引的操作,还应该包括修改索引的一些操作,比如重建索引,改变索引空间大小等等,不过这些操作,跟开发人员关系应该也不大,让DBA烦去吧,所以不总结在这里,了解一下索引的简单用法就OK了。

索引虽然很有用,但是并不是任何时候都适合建立索引,在什么情况下不适合建立索引呢,我看到过这样的一种说法,说下面的情况都不宜建立索引:

(1)被查询的表本身就很小,即使是全表扫描也很快。

(2)基于这张表的查询,大多数情况下需要获取的数据量都超过了总量的4%。

(3)这张表需要进行频繁的更新操作,如果建立了索引,则该索引也会频繁的随之更新,从而会降低数据库整体效率。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
沙发
发表于 2020-4-23 14:23:56 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-4-23 14:24:20 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-24 20:57 , Processed in 0.166174 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表