Finding duplicate indexes

I've seen a note on deleting duplicate indexes!
This should be done very carefuly, as some indexes can have same leading column, but are both needed!

Here is a script that will help you find indexes with the same leading columns, and that will help decide if they are duplicates. Some data will only show if your objects are indexed:

Note: the RULE hint is required for Oracle10gR2, otherwise you run into bug 5455729

<pre>
select /*+ rule */ a.table_owner, a.table_name, a.index_owner, a.index_name, column_name_list,
column_name_list_dup, dup duplicate_indexes, i.uniqueness, i.partitioned, i.leaf_blocks, i.distinct_keys,
i.num_rows, i.clustering_factor
from (
select table_owner, table_name, index_owner, index_name, column_name_list_dup,
dup,
max(dup) OVER ( partition by table_owner, table_name, index_name ) dup_mx
from
(
select table_owner, table_name, index_owner, index_name,
substr(SYS_CONNECT_BY_PATH(column_name, ','),2) column_name_list_dup,
dup
from
(
select index_owner, index_name, table_owner, table_name, column_name,
count(1) OVER ( partition by index_owner, index_name) cnt,
ROW_NUMBER () OVER ( partition by index_owner, index_name order by column_position) as seq,
count(1) OVER ( partition by table_owner, table_name, column_name, column_position) as dup
from sys.dba_ind_columns
where index_owner not in ('SYS', 'SYSTEM','DLOBAUGH'))
where dup!=1
start with seq=1
connect by prior seq+1=seq
and prior index_owner=index_owner
and prior index_name=index_name
)) a,
(
select table_owner, table_name, index_owner, index_name,
substr(SYS_CONNECT_BY_PATH(column_name, ','),2) column_name_list
from
(
select index_owner, index_name, table_owner, table_name, column_name,
count(1) OVER ( partition by index_owner, index_name) cnt,
ROW_NUMBER () OVER ( partition by index_owner, index_name order by column_position) as seq
from sys.dba_ind_columns
where index_owner not in ('SYS', 'SYSTEM'))
where seq=cnt
start with seq=1
connect by prior seq+1=seq
and prior index_owner=index_owner
and prior index_name=index_name
) b, dba_indexes i
where a.dup=a.dup_mx
and a.index_owner=b.index_owner
and a.index_name=b.index_name
and a.index_owner=i.owner
and a.index_name=i.index_name
order by a.table_owner, a.table_name, column_name_list_dup
</pre> 
 
發佈了19 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章