Вы можете запросить 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 обрабатывает нисходящие индексы , как если бы они были индексами на основе функций , и поэтому имена столбцов нельзя сравнивать напрямую с помощью этого метода.
Также обратите внимание, что это утверждение you является спорным.
Удаление таких индексов перекрытия (т. Е. Index2) может улучшить производительность.