索引重叠

时间:2019-06-08 06:49:38

标签: oracle indexing oracle11g

据我了解,索引重叠如下:-

CREATE INDEX idx1 ON TabA ( Col1, Col2, Col3 );
CREATE INDEX idx2 ON TabA ( Col1, Col2 );
CREATE INDEX idx3 ON TabA ( Col1 DESC, Col2 DESC );

在上面的表结构中,索引idx1是索引idx2的超集(重叠),因此是冗余的,因此index1是Index2的重叠。 删除此类重叠索引可以提高性能。

但是我们如何在oracle 11gR2的整个架构中找到所有重叠索引? 有人可以引导我吗?谢谢。

1 个答案:

答案 0 :(得分:1)

您可以通过user_ind_columns查询column_position的列的排序和连接,然后进行自联接进行比较。

WITH indx AS ( SELECT table_name,index_name,LISTAGG(column_name,',') WITHIN GROUP(
                    ORDER BY column_position
               ) AS cols
FROM user_ind_columns a
               GROUP BY table_name,index_name
)
SELECT a.table_name,a.index_name AS sup_index,b.index_name sub_indx,
a.cols as super_set,b.cols AS sub_set
FROM indx a
JOIN indx b ON a.table_name = b.table_name
               AND a.index_name != b.index_name 
               where ','|| a.cols||',' like ',%'|| b.cols|| '%,';

结果

TABLE_NAME    SUP_INDEX                   SUB_INDX            SUPER_SET                SUB_SET       
TABA           IDX1                       IDX2                 COL1,COL2,COL3            COL1,COL2      
JOB_HISTORY    JHIST_EMP_ID_ST_DATE_PK    JHIST_EMPLOYEE_IX    EMPLOYEE_ID,START_DATE    EMPLOYEE_ID    


2 rows selected. 

注释 Oracle数据库将descending indexes视为基于函数的索引,因此无法通过此方法直接比较列名。

还请注意,的说法是有争议的。

  

通过放置此类重叠索引(即Index2)可以提高性能。