I
I think it is good idea to have foreign keys and also have matching indexes. Following script will take care of indexes you missed. It will show you which indexes are missing even for compound foreign keys. But you should check existing indexes just to be sure you are not creating useless index.
WITH f AS ( SELECT t.table_name, t.constraint_name AS index_name, LISTAGG(t.column_name, ', ') WITHIN GROUP (ORDER BY t.position) AS fk_cols FROM user_cons_columns t JOIN user_constraints n ON n.constraint_name = t.constraint_name WHERE n.constraint_type = 'R' GROUP BY t.table_name, t.constraint_name ) SELECT f.table_name, f.index_name, f.fk_cols, i.index_name AS existing_index, i.cols AS index_cols, -- 'CREATE INDEX ' || RPAD(f.index_name, 30) || ' ON ' || RPAD(f.table_name, 30) || ' (' || f.fk_cols || ') COMPUTE STATISTICS;' AS fix FROM f LEFT JOIN ( SELECT i.table_name, i.index_name, LISTAGG(i.column_name, ', ') WITHIN GROUP (ORDER BY i.column_position) AS cols FROM user_ind_columns i GROUP BY i.table_name, i.index_name ) i ON i.table_name = f.table_name AND i.cols LIKE f.fk_cols || '%' WHERE i.index_name IS NULL -- show only missing indexes ORDER BY 1, 2;
Show indexes with columns:
SELECT i.table_name, i.index_name, LISTAGG(i.column_name, ', ') WITHIN GROUP (ORDER BY i.column_position) AS cols FROM user_ind_columns i --WHERE i.table_name LIKE '&TABLE_NAME' GROUP BY i.table_name, i.index_name ORDER BY i.table_name, i.index_name;
Comments
Post a Comment