一、管理准则
Oracle的索引可以更快的定位信息,提供访问表的数据的更快路径。索引的种类有:
● B-Tree索引:默认的最常用索引
● B-Tree簇索引:特意为簇定义的索引
●
散列值索引:特意为散列簇定义的索引
● 全局和局部索引:相应于分区表的索引
● 逆转值索引:特别适用于Oracle真实应用簇的应用
● 位图索引:紧凑的,特别适用于少量值集的列
● 基于函数的索引:包含函数/表达式的预先计算的值
● 域索引:特别针对应用或插件
索引的管理准则包括:
① 在表中插入数据后创建索引
② 索引正确的表和列
* 如需经常检索大表中少于15%的行,则创建索引(百分比值与扫描速度有关)
* 改善多个表联结性能创建索引。特别是外键需要创建索引。
* 小表不需要索引
* 列中的值比较唯一适合创建所以
* 取值范围大(适合作常规索引)
* 取值范围小(适合作位图索引)
* 列中有许多空值,但经常查询所有具有值的行适合创建索引
* 列中有许多空值,但又不查询非空值适合创建索引
注:查询非空值,用 WHERE COL > -9.99 * power(10,125) 效果要比 WHERE COL IS NOT NULL 好,因为可以使用索引。
③ 调整索引列位置(
常用列放在最前面)
④ 限制每个表的索引数量
⑤ 删除不需要的索引(重建索引前必须先删除索引)
⑥ 指定索引数据块空间使用
⑦ 估计索引大小,设置存储参数
⑧ 为每个索引指定表空间
⑨ 考虑并行创建索引
⑩ 考虑用NOLOGGING创建索引
⑾ 考虑合并或重建索引时的损益
⑿ 停用或删除约束之前考虑开销
二、创建索引
1、明确地创建索引
CREATE INDEX emp_ename ON emp(ename)
TABLESPACE users
STORAGE (INITIAL 20K
NEXT 20K
PCTINCREASE 75)
PCTFREE 0;
注:索引创建时不能指定PCTUSED参数。
2、明确得创建唯一索引
唯一索引可以保证键列上表不会有两行重复的值。
CREATE UNIQUE INDEX dept_unique_index ON dept(dname)
TABLESPACE indx;
3、创建与约束相关的索引
在创建UNIQUE KEY或PRIMARY KEY时,会自动创建一个唯一索引,以确保数据的完整性。在使用CREATE TABLE或ALTER TABLE时不需要用户进行操作,但是用户可以使用USING INDEX子句来对创建实施控制。
CREATE TABLE emp (
empno NUMBER(5) PRIMARY KEY,
age INTEGER)
ENABLE PRIMARY KEY USING INDEX
TABLESPACE users
PCTFREE 0;
当要对UNIQUE和PRIMARY KEY约束相关索引进行更明确的控制时:
例1:
CREATE TABLE a (
a1 INT PRIMARY KEY USING INDEX (create index ai on a(a1)));
例2:
CREATE TABLE b (
b1 INT,
b2 INT,
CONSTRAINT bu1 UNIQUE (b1,b2)
USING INDEX (create unique index bi on b(b1,b2)),
CONSTRAINT bu2 UNIQUE (b2,b1) USING INDEX bi);
例3:
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c(c1,c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
4、采集创建索引时伴随的统计数据
CREATE INDEX emp_ename ON emp(ename)
COMPUTE STATISTICS;
5、创建大索引
① 创建一个新的临时表空间
② 将用户默认临时表空间设置为新建的表空间
③ 创建索引
④ 删除表空间,并将用户的临时表空间更改过来
6、联机创建索引
可以用联机创建索引的办法,使得创建时仍可更改基础表
CREATE INDEX emp_name ON emp (mgr,emp1,emp2,emp3) ONLINE;
注:可是使用DML,但不能使用DDL,而且不支持并行执行。
7、创建基于函数的索引
特点:
● 创建更强有力的分类
● 预先计算出计算密集的函数值,并在索引中分类
● 则加优化器执行范围扫描而不是全表扫描的数量
● 真正的降序索引成为可能
● 在对象列和REF列上创建索引
注:在创建基于函数的索引之后,必须ANALYZE分析表。
CREATE INDEX empi ON emp
UPPER((ename),NLSSORT(ename));
8、创建键压缩索引
CREATE INDEX emp_name ON emp(ename)
TABLESPACE users
COMPRESS 1;
可以使用以下语句停用压缩:
ALTER INDEX emp_ename REBUILD NOCOMPRESS;
-The End-