作为一名开发人员,在做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是索引创建的一个规范,不过我一般写的简单,就直接类似: - -- 基于一个列
- CREATE INDEX emp_last_name_idx
- ON employees(last_name);
- -- 基于多个列
- CREATE INDEX emp_last_name_age_idx
- ON employees(last_name, age);
复制代码上面列出的是一种简单索引,还有一类常用的索引叫做函数索引,比如:
- CREATE INDEX emp_upper_last_name_idx
- ON employees(UPPER(last_name));
复制代码如果employees表中存储的last_name英文大小不一,那么当我进行如下查询的时候,如果直接对last_name建立索引就无法调用到索引,所以为了满足下面的查询,我们建立上面的函数索引,查询语句如下: - SELECT * FROM employees e WHERE UPPER(e.last_name) = 'YEDWARD';
复制代码4、删除索引 删除索引的语句: - DROP INDEX emp_upper_last_name_idx;
复制代码对索引的操作,还应该包括修改索引的一些操作,比如重建索引,改变索引空间大小等等,不过这些操作,跟开发人员关系应该也不大,让DBA烦去吧,所以不总结在这里,了解一下索引的简单用法就OK了。
索引虽然很有用,但是并不是任何时候都适合建立索引,在什么情况下不适合建立索引呢,我看到过这样的一种说法,说下面的情况都不宜建立索引: (1)被查询的表本身就很小,即使是全表扫描也很快。 (2)基于这张表的查询,大多数情况下需要获取的数据量都超过了总量的4%。 (3)这张表需要进行频繁的更新操作,如果建立了索引,则该索引也会频繁的随之更新,从而会降低数据库整体效率。
|