索引
索引
为什么引入索引?
索引的概念很简单,类似图书馆的图书目录作用。Oracle为了提高查询效率引入索引。Oracle索引是按照关键字的顺序存放记录的,也叫数据结构。在索引记录中存有索引关键字和指向标中真正数据的指针。由于Oracle所以中值存储索引关键字和指向标中真正数据的指针,因此它的规模比真正存有数据的表的规模小得多,这样对索引进行的操作I/O量比对真正表进行操作少得多。
引入索引的二亩地就是为了加快查询的速度。Oracle索引是一个独立于表的对象,它可以存放在与表不同的磁盘上,索引的删除不会影响真正存有数据的表。在Oracle数据库上,一个索引一旦被建立就由Oracle系统自动维护,而且由Oracle系统决定什么时候使用这个索引。当一个表被删除时所有基于该表的索引都被自动地删除掉。
如何建立索引?
在Oracle数据库中有两种方法建立索引:
1、Oracle系统自动建立--当用户在一个表上建立主键(PRIMARY KEY)或唯一(UNIQUE)约束时,Oracle系统会自动创建唯一索引(UNIQUE INDEX)
2、手工建立--用户在一个表中的一列或多列上用CREATE INDEX语句来创建非唯一索引(NOTUNIQUE INDEX)
创建索引的命令格式如下:
CREATE INDEX 索引名
ON 表名 (列名[,列名]...);
准备:
CREATE TABLE user_simple
AS
SELECT user_id,mobile_no,name_cn
FROM user_base_info;
SELECT * FROM user_simple;
例子:
CREATE INDEX user_name_cn_idx
ON user_simple(name_cn);
Oracle推荐的索引的命名方式:表名_列名_对象类型
如何查看索引
可以使用Oracle数据字典user_indexes来查看您的用户下的索引信息。
SELECT INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
FROM user_indexes
WHERE TABLE_NAME = 'USER_SIMPLE';
上面可以得到索引基于哪个表并不能得到是哪个列,要得到这方面信息,使用数据字典user_ind_columns
SELECT index_name, table_name, column_name, column_position
FROM user_ind_columns
WHERE TABLE_NAME = 'USER_SIMPLE';
column_position我们现在得到的值是1,这个列是什么意思呢?
我们创建一个组合索引:
CREATE INDEX user__mobile_name_idx
ON user_simple (mobile_no,name_cn);
然后执行前面的语句发现在符合索引第二列的数据的column_position=2
使用索引时应注意的问题
1、尽管在一个表上建立索引可能加快查询的速度,但是会降低DML操作的速度,因为DML需要维护调整索引,索引作为独立的磁盘对象也需要消耗磁盘空间
2、虽然您建立了索引,但Oracle系统不保证一定使用它。为了让Oracle系统有可能使用索引,您应该把索引关键字放在SELECT语句的WHERE子句中。但这也不能保证Oracle系统百分之百地使用索引。例如将组合索引中的一个索引关键字放在了SELECT语句的WHERE子句中,而该索引关键字不是最左边的索引关键字
当下列条件之一成立的时候,您应该为这个表建立索引
1、表很大而且大多数的返回数据量很少(Oracle推荐为小于总行数的百分之二到百分之四)。因为如果返回数据量很大的话就不如顺序地扫描这个表了
2、此列的取值范围很广,一般为随机分布
3、一列或多列经常出现在WHERE子句或连接条件中
4、标上的DML操作较少
5、此列中包含了大量的空值(NULL)
6、此列不经常作为SELECT语句中某个表达式的一部分
基于表达式的索引
SQL>CREATE INDEX empcon_salgt_idx
ON empcon(sal-2000);
如何确认Oracle系统是否使用了索引
可以使用SQL*PLUS的EXPLAN命令来得到有关索引使用的情况的信息,有点烦了
怎么删除索引
删除索引的格式如下:
DROP INDEX 索引名
例子:
DROP INDEX EMPCON_JOB_SAL_IDX
删除表的同时可以删除与表有关的索引
DROP TABLE user_simple;

浙公网安备 33010602011771号