唯一索引:
确保在定义索引的列中没有 重复值
ORACLE自动在表的主健列上创建唯一索引
create unique index item_index on itemfile(itemcode);
位图索引:
主要用重复值多的,列如:性别, 或只有0 1 ,那么用此索引
create index bitmap 索引名 on 表(列)
复合索引(组合索引):
组合索引是在表的多个列上创建的索引
索引中列的顺序是任意的
如果SQL语句的WHERE子句中引用了组合索引的所有列或大多数列,则可以提高检索速度
主要是where 条件后的大于1 个
create index 索引名 on 表(列1,列2....)
反向索引:
反向索引反转索引列键值得每个字节
通常建立在值是连续增长的列上,使数据均匀的分布在整个索引上
主要用于像序列 0001 。0002
create index 索引名 on 表(列) reverse
create index rev_index on itemfile (itemcode) REVERSE;
alter index rev_index REBUID NOREVERSE;
压缩索引:
主要是压缩空间,列如,有主健关系的从表的关联列有重复值较多,用此
create index 索引名 on 表(列) compress
函数索引:
在where条件下游函数时,所建立的索引会无效,必须建函数索引
Oracle8i的很重要的一个新特性就是增加了function-based index这种索引类型(后面简称为FBI)。有了这个特性后,Oracle DBA就可以在索引中使用函数或者表达式了。这些函数可以使Oracle自己的函数,也可以使用户自己的PL/SQL函数等。
例如:
使用基于成本的优化器,索引为标准的B树索引,建立在SURNAME列上。
SQL>create index non_fbi on sale_contacts (surname);
SQL>analyze index non_fbi compute statistics;
SQL>:analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts
WHERE UPPER(surname) = 'ELLISON';
现在我们试着建立一个FBI索引:
SQL>create index fbi on sale_contacts (UPPER(surname));
SQL>analyze index fbi compute statistics;
SQL>analyze table sale_contacts compute statistics;
SQL>SELECT count(*) FROM sale_contacts WHERE UPPER(surname) = 'ELLISON';
Execution Plan
在PL/SQL developer中用F5进行对比察看
-----
基于函数的索引:
基于一个或多个列上的函数或表达式创建的索引
表达式中不能出现聚合函数
不能再LOB类型的列上创建
创建时必须具有query rewrite权限
CREATE INDEX lowercase_idx ON toys(LOWER(toyname));
SELECT toyid FROM toys WHERE lower(toyname)='doll';
索引组织表
索引组织表的数据存储在与其关联的索引中
索引中存储的是行的实际数据,而不是ROWID
基于主键访问数据
CREATE TABLE命令与ORGANIZATION INDEX子句一起用于创建索引组织表
CREATE TABLE ind_org_tab(
vencode number(4) primary key,
venname varchar2(20)
) ORGANIZTION INDEX;
普通表 索引组织表
普通表 | 索引组织表 |
ROWIS唯一的标识行 | 主键唯一的标识行 |
隐式的ROWID列 | 没有隐式的ROWID列 |
基于ROWID的访问 | 基于主键的访问 |
顺序扫描返回所有行 | 完全索引扫描返回所有行,并按主键顺序排列 |
支持分区 | 不支持分区 |