【问题标题】:Overlapping of Index索引的重叠
【发布时间】:2019-10-23 13:01:45
【问题描述】:

根据我的理解,索引的重叠如下:-

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 的整个模式中找到所有重叠索引? 有人可以指导我吗?提前谢谢。

【问题讨论】:

    标签: oracle indexing oracle11g


    【解决方案1】:

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

    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 视为基于函数的索引,因此无法通过此方法直接比较列名。 p>

    另请注意,的这一说法是有争议的。

    删除此类重叠索引(即 Index2)可以提高性能。

    【讨论】:

    • @Santu。 : 不客气。如果您发现答案有用,请考虑accepting,这样它也可以帮助其他人。另请阅读this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多