管理索引
1、索引和表的关系:书目录和书的关系。在数据库中只有索引和表才能申请空间分配。是独立存在的物理结构。实现数据的唯一性。
2、索引:独立于表的指针(物理结构)。指向表数据:rowid。通过索引可以定位到表数据所在行的行号,行号唯一标识这一行数据所在的物理位置。优点:加速查找速度缺点:数据改变是有负载的。并非所有环境索引越多越好。数据面向读,索引多;数据面向写,索引少。索引结构是b-tree结构的(b-tree结构两层:非页级nonleaf和页级leaf<指针所在的位置>)。
3、索引类型和他们的用途
索引分类:按逻辑来分类、按物理来分类
a.按逻辑来分类:单行索引和复合索引(concatenated)、唯一索引和非唯一索引、基于函数的索引、Domain域
b.按物理来分类:分区视图或非分区视图(放在不同段分区中,加速数据访问的速度)、B-Tree索引(Normal常规索引or reverse key)、位图索引(Bitmap)
4、创建各种不同类型的索引
B-Tree Index:B树索引(适用于取值唯一性很高的栏位,多个候选键,数据更新代价相对比较低,用or查询效率低,用于OLTP)
Root(根)>Branch(子目录)>Leaf(树叶)->指针pointer指向Table表。
Root是非页级,Branch、Leaf是页级。
sql>select * from kong.stores where stor_id like '7%';
Bitmap Index:位图索引(适用于取值唯一性很低的栏位中,比如说0\1,数据更新系统负担贵,用or查询效率高,用于数据仓库OLAP)
sql>create index testindex1 on kong.orders(orderid) tablespace users;
sql>conn kong/kxf_001@fox
sql>create bitmap index testbit1 on sales(payterms) tablespace users;
sql>create index testindex2
on stores(stor_name)
tablespace users
pctfree 20
pctused 40
storage(initial 100k next 100k); //注意:pctused是不能用的。
sql>del 5
sql>run
创建索引时应考虑以下因素:
a、平衡query查询和DML(数据改变)需要
b、索引放在一个独立的表空间中,把索引和数据分开,有利于并发读写
c、使用统一的分区大小:5个块大小的整数倍或者最小的表空间分区大小
d、建立索引的过程对于大数量的索引不要做日志。(大数量的索引不要做日志)
e、建立索引的initrans 大于等于表所制定的initrans
sql>show parameter create_bit //create_bitmap_area_size 创建bitmap的区域尺寸 默认8388608(8MB)
sql>select * from order_details; //orderid是顺序的序列号(10490、10491、10492。。。),不利于查询
sql>create index testindex3 on orders(orderid)reverse; //做反转索引(09401、19401、29401,。。。)
5、组织索引
(1)改变索引的存储参数
sql>alter index testindex3
pctfree 20
storage(next 200k pctincrease 20);
(2)手工强制分配空间或清除无用的索引空间
ALTER INDEX orders_region_id_idx ALLOCATE EXTENT(SIZE 200K DATAFILE '/DISK6/indx01.dbf'); //注意DATAFILE是原来索引所在的表空间
ALTER INDEX orders_id_idx DEALLOCATE UNUSED;
sql>alter index testindex3 allocate extent(size 100k datafile 'd:\oracle\oradata\fox\users01.dbf');
sql>alter index testindex3 deallocate unused;
(3)索引重建:ALTER INDEX ...REBUILD...
a.可以移动索引到一个不同的表空间
b.改善空间的应用,把被删除(逻辑删除)的实体移除,把空间释放出来
c.改变一个反转键和一个正常的B树索引之间进行转换,但不可以在B树索引和位图索引之间进行转换。
sql>alter index testindex3 rebuild tablespace indx;
sql>alter indext testindex3 rebuild reverse; //反转和B树索引转换
sql>alter indext testindex3 rebuild bitmap; //错,注意:位图索引和B树索引不可以转换。
(4)ONLINE Rebuild of Indexes 在线重建
在旧有的索引的基础上建立索引,对表不加以锁定。在运行过程中为了保持系统的并发性而引入的。
sql>alter index testindex3 rebuild online;
注意:在线重建索引中,位图索引和B树索引同样不可以转换。
(5)索引碎片整理:
ALTER INDEX orders_id_idx COALESCE;
sql>alter index testindex3 coalesce;
(6)检查索引有效性:
ANALYZE INDEX orders_region_id_idx VALIDATE STRUCTURE;
sql>analyze index testindex3 validate structure; //分析索引事实上是更新索引统计信息的过程
sql>desc index_stats //index_stats指标进行更新
6、删除索引
DROP INDEX hr.deptartments_name_idx;
建立的索引在数据查询的时候用不到,在数据更新的时候又是负担,就一定要删除这类没用的索引。有些索引平时用的比较少,在进行数据装入时,从其他系统中把大批量的数据加载进来时,可以考虑把索引删除,再把数据load进来,再重新建索引。因为在表上建的索引越多,在load数据时系统负担越重。
sql>select * from user_indexes;//列出全部用户索引
sql>drop index testbit1;
sql>drop index testindex2;
7、如何标识没有用到的索引
ALTER INDEX summit.orders_id_idx MONITORING USEAGE //监视他的应用来判定索引在系统中到底有没有被用到
ALTER INDEX summit.orders_id_idx NOMONTITORING USAGE //取消监视
sql>alter index testindex3
monitoring usage;
sql>l2
sql>c /monitoring/nomonitoring/
sql>run
8、从数据字典中获取索引信息
DBA_INDEXES、DBA_IND_COLUMNS、DBA_IND_EXPRESSIONS、V$OBJECT_USAGE
sql>select * from user_indexes;
sql>select * from all_indexes;
sql>select * from dba_indexes;
sql>desc dba_ind_columns //列出索引栏位参数
sql>select index_name,table_name,column_name from dba_ind_columns
where table_name='ORDERS' AND table_owner='KONG';
sql>desc orders //列出orders表中的栏位
sql>create index testindex4 on orders(orderdate-requireddate); //创建表达式时间差值的索引进行数据查询以加速数据访问