一、怎样选择索引(8建议)
1.由于唯一索引扫描效率最高,因此能使用唯一索引,尽量使用唯一索引;
2.对于取值基数较少的字段,如性别、状态、Check项,尽量使用位图索引;
3.由于NULL值在索引中没有定义,因此建议尽量不要在允许NULL值的列上建立索引,虽然Oracle宣称在允许NULL值的列上位图索引,也是有效的,但我们依然强烈建议可以将null指定为一个默认的值后再建立索引;
4.根据实际情况,一般对于列不超过10个,数据不超过1万行的表不要建立索引,此种情况在应用中往往能占40%以上;
5.一个表中不是建立的索引越多越好,相反过多的索引可能影响整体的性能,至少影响INSERT、DELETE和UPDATE的性能;
6.对于查询中的WHERE子句经常需要使用多个AND条件一起使用时,应建立联合索引,一般情况下,此种联合索引是标示一行唯一记录的,而主键使用代理主键,并且尽量将值少的列放在前面;
7.对于多表联合查询,及表连接的问题,对于连接的字段,需要建立索引;
8.平衡索引与更新的关系。如果一个大表的更新操作多于查询操作,建议可以少建立索引;如果一个大表的查询操作多于更新操作则可以考虑多使用索引。
二、何时需要重建索引
1.叶子节点中浪费的空间大于20%时
analyze index IDX_ACCOUNT_TRADE_YHKH validate structure;
select a.name,(a.del_lf_rows_len/a.lf_rows_len) * 100 from index_stats a
其中del_lf_rows_len是叶子节点中被删除的行数; lf_rows_len是叶子节点的行数
alter index IDX_ACCOUNT_TRADE_YHKH rebuild或者删除该索引再创建
2.监视索引的使用情况,对从来没使用的索引进行删除
v$object_usage
三、查询出所有的用户表
1、查询出用户所有表的索引
select * from user_indexes
2、查询用户表的索引(非聚集索引):
select * from user_indexes where uniqueness='NONUNIQUE'
3、查询用户表的主键(聚集索引):
select * from user_indexes where uniqueness='UNIQUE'
4、查询表的索引
select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and
t.table_name='NODE'
5.查询一个用户中存在的过程和函数
select object_name,created,status from user_objects
where lower(object_type) in ('procedure','function');
6.查询其它角色表的权限
select * from role_tab_privs ;