WITH table_defs AS (
SELECT
c.owner,
c.table_name,
LISTAGG(c.column_name || ':' || c.data_type || ':' || c.data_length, ',')
WITHIN GROUP (ORDER BY c.column_id) AS col_signature
FROM all_tab_columns c
WHERE c.owner NOT IN (
'SYS', 'SYSTEM', 'XDB', 'OUTLN', 'MDSYS', 'ORDDATA', 'ORDSYS',
'CTXSYS', 'DBSNMP', 'APPQOSSYS', 'AUDSYS', 'DVSYS',
'GSMADMIN_INTERNAL', 'ANONYMOUS', 'WMSYS', 'OLAPSYS',
'LBACSYS', 'SI_INFORMTN_SCHEMA'
)
GROUP BY c.owner, c.table_name
),
table_sizes AS (
SELECT
owner,
segment_name AS table_name,
ROUND(SUM(bytes)/1024/1024, 2) AS size_mb
FROM dba_segments
WHERE segment_type = 'TABLE'
GROUP BY owner, segment_name
),
duplicates AS (
SELECT col_signature
FROM table_defs
GROUP BY col_signature
HAVING COUNT(*) > 1
)
SELECT
d.col_signature,
d.owner,
d.table_name,
NVL(s.size_mb, 0) AS size_mb
FROM table_defs d
JOIN duplicates dup
ON d.col_signature = dup.col_signature
LEFT JOIN table_sizes s
ON d.owner = s.owner AND d.table_name = s.table_name
ORDER BY d.col_signature, d.owner, d.table_name;





0 comments:
Post a Comment