分享

Oracle学习笔记(10)管理索引

 忧郁_小刚 2011-05-20

管理索引

 

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); //创建表达式时间差值的索引进行数据查询以加速数据访问

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多