select count(*) from dba_indexes where tablespace_name = ''SYSTEM'' and owner not in (''SYS'',''SYSTEM'') / |
select segment_name, count(*) from dba_extents where segment_type=''INDEX'' and owner=UPPER(''&owner'') group by segment_name / |
select substr(segment_name,1,20) "SEGMENT NAME", bytes, count(bytes) from dba_extents where segment_name in ( select index_name from dba_indexes where tablespace_name=UPPER(''&表空间'')) group by segment_name,bytes order by segment_name / |
三. 索引的选择性
索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99。
一个索引的选择性越接近于1,这个索引的效率就越高。
如果是使用基于cost的最优化,优化器不应该使用选择性不好的索引。如果是使用基于rule的最优化,优化器在确定执行路径时不会考虑索引的选择性(除非是唯一性索引),并且不得不手工优化查询以避免使用非选择性的索引。
确定索引的选择性,可以有两种方法:手工测量和自动测量。
(1)手工测量索引的选择性
如果要根据一个表的两列创建两列并置索引,可以用以下方法测量索引的选择性:
列的选择性=不同值的数目/行的总数 /* 越接近1越好 */
select count(distinct 第一列||''%''||第二列)/count(*) from 表名 / |