1. 使用索引可以直接和快速地访问表中的行。索引的目的是通过使用一个索引的路径来快速查找数据,从而减少必须的磁盘I/O操作。索引是由Oracle服务器自动使用和维护的。索引一旦创建,用户就不需要执行直接的操作了。索引在逻辑上和实际上都独立于他们索引的表。这意味着可以在任何时候创建和删除索引,而不会对基表或其他索引产生影响。当删除表时,相应的索引也会被删除。
2. 创建索引
自动创建:如果在表定义中定义了PRIMARY KEY或UNIQUE约束,则系统会自动创建一个唯一索引。(索引的名称和该约束的名称一样)
手动创建:可以在列上创建非唯一的索引,以加速对行的访问。
Create index emp_lastname_idx
On employees(last_name);
3. 什么情况下要创建索引:
列包含较大范围的值
列包含大量空值
在where字句或连接条件中频繁使用一个或多个列
表相当大,但是预计多数的查询检索的行不到总行数的20%~40%
注:并不是表的索引越多,查询就会越快。对具有索引的表提交的每次DML操作,都意味着必须更新索引。与表关联的索引越多,在DML操作之后,Oracle服务器为更新全部索引所做的工作就越多。
4. 确认索引:
USER_INDEXES数据字典视图包含索引的名称及其唯一性
USER_IND_COLUMNS视图包含索引名、表名和列名。
Select ic.index_name, ic.column_name, ic.column_position col_pos, ix.uniqueness
From user_indexes ix, user_ind_columns ic
Where ic.index_name=ix.index_name and ic.table_name=’EMPLOYEES’
5. 基于函数的索引:
就是基于表达式的索引,索引表达式是用表列、常数、SQL函数和自定义函数构建的。
Create index upper_dept_name_idx
On departments ( UPPER(department_name))
Select * from departments where UPPER(department_name)=’SALES’;
6. 不能更改索引,要更改只能先删除,再创建。