Run following selects to discover prefix and suffix hierarchies and to get count of particular prefix/suffix occurrences. That will help you become familiar with naming standard and to find suspicious prefixes/suffixes that belong to tables that probably store junk data.
with prefix_generator( prefix, p_prefix, object_name, lvl ) as (
select regexp_substr( object_name, '.*?_' ) prefix
, null as p_prefix
, object_name as object_name
, 1 as lvl
from (
select table_name as object_name
from all_tables
where owner like 'YOUR_OWNER'
and temporary like 'N'
) q0
union all
select g.prefix || regexp_substr(
substr( g.object_name, length( g.prefix ) + 1 ), '.*?_'
) as prefix
, g.prefix as p_prefix
, g.object_name
, g.lvl + 1
from prefix_generator g
where regexp_substr(
substr( g.object_name, length( g.prefix ) + 1 ), '.*?_'
) is not null
)
, groupped_generator as (
select prefix,
p_prefix
from prefix_generator
group by prefix,
p_prefix
)
, forward_builder(
prefix
, lvl
, padded_prefix
) as (
select g.prefix
, 0 as lvl
, g.prefix padded_prefix
from groupped_generator g
where g.p_prefix is null
group by g.prefix
union all
select n.prefix
, p.lvl + 1 as lvl
, lpad( ' ', ( p.lvl + 1 ) * 4 ) || n.prefix padded_prefix
from groupped_generator n
join forward_builder p
on p.prefix = n.p_prefix
) search depth first by prefix set order_by
, count_by_prefix as (
select prefix
, count( * ) cnt
from prefix_generator g
group by prefix
)
select b.padded_prefix
, c.cnt
from forward_builder b
join count_by_prefix c
on c.prefix = b.prefix
where 2 < c.cnt
order by order_by
;/
with postfix_generator( postfix, p_postfix, object_name, lvl ) as (
select regexp_substr( object_name, '_.*' ) postfix
, object_name as p_postfix
, object_name as object_name
, 1 as lvl
from (
select table_name as object_name
from all_tables
where owner like 'YOUR_OWNER'
and temporary like 'N'
) q0
union all
select regexp_substr(
substr( g.postfix, 2 ), '_.*'
) as postfix
, g.postfix as p_postfix
, g.object_name
, g.lvl + 1
from postfix_generator g
where g.postfix is not null -- recursion breaker
)
, groupped_generator as (
select postfix,
p_postfix
from postfix_generator
where p_postfix <> object_name
group by postfix,
p_postfix
)
, backward_builder(
p_postfix
, lvl
, padded_p_postfix
) as (
select g.p_postfix
, 0 as lvl
, g.p_postfix padded_p_postfix
from groupped_generator g
where g.postfix is null
group by g.p_postfix
union all
select n.p_postfix
, p.lvl + 1 as lvl
, lpad( ' ', ( p.lvl + 1 ) * 4 ) || n.p_postfix padded_p_postfix
from groupped_generator n
join backward_builder p
on p.p_postfix = n.postfix
) search depth first by p_postfix set order_by
, count_by_postfix as (
select postfix
, count( * ) cnt
from postfix_generator g
where postfix is not null
group by postfix
)
select b.padded_p_postfix
, c.cnt
from backward_builder b
join count_by_postfix c
on c.postfix = b.p_postfix
where 2 < c.cnt
order by b.order_by
;/
To select all prefixes and suffixes (not only those having more than two occurrences) delete 'where 2 < c.cnt' clause.
No comments:
Post a Comment