ORACLE 数据库对象
——索引
q 索引是与表相关的一个可选结构
q 用以提高 SQL 语句执行的性能
q 减少磁盘I/O
q 使用 CREATE INDEX 语句创建索引
q 在逻辑上和物理上都独立于表的数据
q Oracle 自动维护索引
索引的目标:提高查询性能
索引对增删改查的影响
SQL语句 | 对性能的影响 |
SELECT | 查询性能提高 |
UPDATE | 更新删除时需要先查询,从此角度性能提高 更新删除时引起索引修改,从此角度性能下降 |
DELETE | |
INSERT | 增加引起索引改变,索引对其负面影响更大,性能下降 |
什么时候建立索引?
1. 需要频繁查询的数据
2. 数据量较多
3. 该列不会频繁 update/insert/delete
4. 在 where/order by/group by 字句中出现的列
5. 在高基数列上建立索引(重复数据不多)
|
|
| ||||||||||||||||||||||||||||||
基数:3/4 | 基数:1/4 |
索引的类型
唯一索引
位图索引
组合索引
基于函数的索引
反向键索引
创建标准索引
CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs;
|
重建索引
ALTER INDEX item_index REBUILD;
|
删除索引
DROP INDEX item_index;
|
唯一索引
q 唯一索引确保在定义索引的列中没有重复值 q Oracle 自动在表的主键列上创建唯一索引 q 使用CREATE UNIQUE INDEX语句创建唯一索引 CREATE UNIQUE INDEX item_index ON itemfile (itemcode);
|
组合索引
q 组合索引是在表的多个列上创建的索引 q 索引中列的顺序是任意的 q 如果 SQL 语句的 WHERE 子句中引用了组合索引的所有列或大多数列,则可以提高检索速度 CREATE INDEX comp_index ON itemfile(p_category, itemrate);
|
反向键索引
q 反向键索引反转索引列键值的每个字节 q 通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上 q 创建索引时使用REVERSE关键字 CREATE INDEX rev_index ON itemfile (itemcode) REVERSE; ALTER INDEX rev_index REBUID NOREVERSE;
|
位图索引
q 位图索引适合创建在低基数列上 q 位图索引不直接存储ROWID,而是存储字节位到ROWID的映射 q 减少响应时间 q 节省空间占用 CREATE BITMAP INDEX bit_index ON order_master (orderno);
|
索引组织表
q 索引组织表的数据存储在与其关联的索引中 q 索引中存储的是行的实际数据,而不是ROWID q 基于主键访问数据 q CREATE TABLE 命令与 ORGANIZATION INDEX 子句一起用于创建索引组织表 CREATE TABLE ind_org_tab ( vencode NUMBER(4) PRIMARY KEY, venname VARCHAR2(20) ) ORGANIZATION INDEX;
|
基于函数的索引
q 基于一个或多个列上的函数或表达式创建的索引 q 表达式中不能出现聚合函数 q 不能在LOB类型的列上创建 q 创建时必须具有 QUERY REWRITE 权限 CREATE INDEX lowercase_idx ON toys (LOWER(toyname)); SELECT toyid FROM toys WHERE LOWER(toyname)='doll';
|