M
My personal preferrence is to match index names with constraint names. At least with primary keys, foreign keys and unique constraints. That way I know the purpose of the index just from its name resp. prefix.
This script suggests changes for unique constraints (including PK):
WITH i AS (
SELECT
d.table_name,
d.index_name,
LISTAGG(d.column_name, ', ') WITHIN GROUP (ORDER BY d.column_position) AS cols
FROM user_ind_columns d
JOIN user_indexes i
ON i.index_name = d.index_name
WHERE i.uniqueness = 'UNIQUE'
GROUP BY d.table_name, d.index_name
),
p AS (
SELECT
c.table_name,
c.constraint_name,
LISTAGG(c.column_name, ', ') WITHIN GROUP (ORDER BY c.position) AS cols
FROM user_cons_columns c
JOIN user_constraints n
ON n.constraint_name = c.constraint_name
AND n.constraint_type IN ('P', 'U')
GROUP BY c.table_name, c.constraint_name
)
SELECT
p.table_name,
p.constraint_name,
p.cols AS table_cols,
i.index_name,
i.cols AS index_cols,
--
'ALTER INDEX ' || RPAD(i.index_name, 30) ||
' RENAME TO ' || p.constraint_name || ';' AS fix
FROM i
JOIN p
ON p.table_name = i.table_name
AND p.cols = i.cols
AND p.constraint_name != i.index_name
ORDER BY 1, 2;
This script suggests changes for foreign keys:
WITH i AS (
SELECT
d.table_name,
d.index_name,
LISTAGG(d.column_name, ', ') WITHIN GROUP (ORDER BY d.column_position) AS cols
FROM user_ind_columns d
JOIN user_indexes i
ON i.index_name = d.index_name
GROUP BY d.table_name, d.index_name
),
f AS (
SELECT
c.table_name,
c.constraint_name,
LISTAGG(c.column_name, ', ') WITHIN GROUP (ORDER BY c.position) AS cols
FROM user_cons_columns c
JOIN user_constraints n
ON n.constraint_name = c.constraint_name
AND n.constraint_type IN ('R')
GROUP BY c.table_name, c.constraint_name
)
SELECT
f.table_name,
f.constraint_name,
f.cols AS table_cols,
i.index_name,
i.cols AS index_cols,
--
'ALTER INDEX ' || RPAD(i.index_name, 30) ||
' RENAME TO ' || f.constraint_name || ';' AS fix
FROM f
JOIN i
ON f.table_name = i.table_name
AND f.cols = i.cols
AND f.constraint_name != i.index_name
WHERE i.index_name NOT IN (
SELECT p.constraint_name
FROM user_constraints p
WHERE p.constraint_type IN ('P', 'U')
)
ORDER BY 1, 2;
Comments
Post a Comment