一 ROWID的概念
存储了row在数据文件中的具体位置位编码的数据AZ az + 和 /
row在数据块中的存储方式
SELECT ROWID last_name FROM hremployees WHERE department_id = ;
比如OOOOOOFFFBBBBBBRRR
OOOOOOdata object number 对应dba_objectsdata_object_id
FFFfile# 对应v$datafilefile#
BBBBBBblock#
RRRrow#
Dbms_rowid包
SELECT dbms_rowidrowid_block_number(AAAGFqAABAAAIWEAAA) from dual;
具体到特定的物理文件
二 索引的概念
类似书的目录结构
Oracle 的索引对象与表关联的可选对象提高SQL查询语句的速度
索引直接指向包含所查询值的行的位置减少磁盘I/O
与所索引的表是相互独立的物理结构
Oracle 自动使用并维护索引插入删除更新表后自动更新索引
语法CREATE INDEX index ON table (column[ column]);
Btree结构(非bitmap)
[一]了解索引的工作原理
表emp
目标查询Frank的工资salary
建立索引create index emp_name_idx on emp(name);
[试验]测试索引的作用
运行/rdbms/admin/utlxplan 脚本
建立测试表
create table t as select * from dba_objects;
insert into t select * from t;
create table indextable
as select rownum idownerobject_namesubobject_name
object_iddata_object_idobject_typecreated
from t;
set autotrace trace explain
set timing on
分析表可以得到cost
查询 object_name=DBA_INDEXES
在object_name列上建立索引
再查询
[思考]索引的代价
插入更新
三 唯一索引
何时创建当某列任意两行的值都不相同
当建立Primary Key(主键)或者Unique constraint(唯一约束)时唯一索引将被自动建立
语法CREATE UNIQUE INDEX index ON table (column);
演示
四 组合索引
何时创建当两个或多个列经常一起出现在where条件中时则在这些列上同时创建组合索引
组合索引中列的顺序是任意的也无需相邻但是建议将最频繁访问的列放在列表的最前面
演示(组合列单独列)
五 位图索引
何时创建
列中有非常多的重复的值时候例如某列保存了 性别信息
Where 条件中包含了很多OR操作符
较少的update操作因为要相应的跟新所有的bitmap
结构位图索引使用位图作为键值对于表中的每一数据行位图包含了TRUE()FALSE()或NULL值
优点位图以一种压缩格式存放因此占用的磁盘空间比标准索引要小得多
语法CREATE BITMAP INDEX index ON table (column[ column]);
掩饰
create table bitmaptable as select * from indextable where owner in(SYSPUBLIC);
分析查找建立索引查找
六 基于函数的索引
何时创建在WHERE条件语句中包含函数或者表达式时
函数包括算数表达式PL/SQL函数程序包函数SQL函数用户自定义函数
语法CREATE INDEX index ON table (FUNCTION(column));
演示
必须要分析表并且query_rewrite_enabled=TRUE
或者使用提示/*+ INDEX(ic_index)*/
七 反向键索引
目的比如索引值是一个自动增长的列
多个用户对集中在少数块上的索引行进行修改容易引起资源的争用比如对数据块的等待此时建立反向索引
性能问题
语法
重建为标准索引反之不行
八 键压缩索引
比如表landscp的数据如下
site feature job
Britten Park Rose Bed Prune
Britten Park Rose Bed Mulch
Britten Park Rose Bed Spray
Britten Park Shrub Bed Mulch
Britten Park Shrub Bed Weed
Britten Park Shrub Bed Hoe
……
查询时以上列均在where条件中同时出现所以建立基于以上列的组合索引但是发现重复值很多所以考虑压缩特性
Create index zip_idx
on landscp(site feature job)
compress ;
将索引项分成前缀(prefix)和后缀(postfix)两部分前两项被放置到前缀部分
Prefix : Britten Park Rose Bed
Prefix : Britten Park Shrub Bed
实际所以的结构为
Prune
Mulch
Spray
Mulch
Weed
Hoe
特点组合索引的前缀部分具有非选择性时考虑使用压缩减少I/O增加性能
九 索引组织表(IOT)
将表中的数据按照索引的结构存储在索引中提高查询速度
牺牲插入更新的性能换取查询性能通常用于数据仓库提供大量的查询极少的插入修改工作
必须指定主键插入数据时会根据主键列进行B树索引排序写入磁盘
十 分区索引
簇:
A cluster is a group of tables that share the same data blocks because they share common columns and are often used together