64.索引分类:
存储方式:B*-树索引,反向索引和位图索引
索引列方式:单列索引和复合索引
索引列值唯一性方式:唯一索引和非唯一索引,索引列都允许null
65.索引管理的指导方针
装载数据后建立索引
索引正确的表和列
限制表的索引个数
删除不再需要的索引
指定索引块空间使用参数
指定索引所在的表空间
考虑并行建立索引
使用NOLOGGING选项建立索引
当在大表上建立索引时,使用NOLOGGING选项可以最小化重做记录。
66.B*-树索引是以B*-树结构组织并存放索引数据的,它是最常用的索引类型,默认情况下索引数据是以升序方式排列的。
根块(一个):索引顶级块,它包含指向下一级节点(分支块或叶块)的信息
分支块:它包含指向下一级节点(分支块或叶块)的信息
叶块:它包含索引入口数据,索引入口包含索引列值和受限ROWID
使用B*-数索引
从Oracle10g开始,Oracle会自动搜集表及其索引的统计信息。建立B*-树索引后,如果在WHERE子句中引用索引列,Oracle会根据统计
信息确定是否使用B*-树索引定位表行数据
create index ind_ename on emp(ename) pctfree 30 tablespace user02;
set autotrace on explain
select * from emp where ename=’SCOTT’;
位图索引以位值标识索引行数据,主要用在DSS(Decision Support System)系统中执行数据统计、数据汇总等操作。B*-树索引建立在重复值很少的列上,而位图索引建立在重复值很多、不同值相对固定的列上。
create bitmap index idx_gender on customers(cust_gender);
对于B*-树索引来说,使用OR谓词效率很低,使用位图索引时,因为可以执行位图合并,索引使用AND、OR或NOT谓词的效率很高。
当在where子句中引用位图列,并使用AND、OR或NOT谓词时,Oracle会执行位图合并操作
select count(*) from customers where cust_gender = 'F' or cust_gender = 'M';
反向索引是索引列值按照相反顺序存放的索引
B*-树索引既使用于范围查询,也适用于等值查询,而反向索引只适用于等值查询
create index customers_pk on customers(cust_id) reverse;
alter index customers_pk rebuild reverse;
alter index department_dname rebuild;
合并索引
alter index department_dname coalesce;
drop index department_dname;
select index_name,index_type,uniqueness from dba_indexes
where owner=’SCOTT’ and table_name=’EMP’;
函数索引:建立函数索引要求用户必须具有QUERY REWRITE系统权限
create index idx_fname on customers(lower(cust_first_name));
唯一索引列可以为null
在表A上建立基于(cola,colb)的组合索引,以下select语句可以使用该索引
select * from a where cola=1 and colb=5;
select * from a where cola=1;
select * from a where colb=5 and cola=1;
B*-树索引和函数索引可以用于范围查询
67.约束分类
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
约束状态
ENABLE VALIDATE(默认状态):要求新、旧数据必须同时满足约束规则
ENABLE NOVALIDATE:已存在数据可以不满足约束规则,但新数据必须满足约束规则
DISABLE VALIDATE:不允许在表上执行任何DML操作
DISABLE NOVALIDATE:新、旧数据都可以不满足约束规则
修正约束数据
使用ENABLE VALIDATE选项激活约束时,如果已存在数据不满足约束规则,则会提示错误信息,并且激活约束会失败。
此时必须对已存在数据进行修正,以确保这些数据全部满足约束规则。
建立EXCEPTIONS表
@ORACLE_HOME/rdbms/admin/utlexcpt.sql
激活约束(带有EXCEPTIONS选项)
Oracle自动将不满足约束规则的行位置(ROWID)插入到表EXCEPTIONS中
alter table employee enable validate constraint check_job exceptions into exceptions;
确定不满足约束规则的行
select job,rowid from employee where rowid in (select row_id from exceptions) for update;
修正数据,激活约束