Difference between revisions of "Index Monitoring"

From Tom's notes
Jump to navigation Jump to search
(Created page with "Enable monitoring: <source lang="sql"> select 'alter index ' || owner || '.' || index_name || ' monitoring usage;' from dba_indexes where owner = '?' and index_type not...")
 
 
Line 1: Line 1:
 +
=Setting up=
 
Enable monitoring:
 
Enable monitoring:
 
<source lang="sql">
 
<source lang="sql">
Line 21: Line 22:
 
select *
 
select *
 
   from v$object_usage;
 
   from v$object_usage;
 +
</source>
 +
 +
=Querying=
 +
Total list
 +
<source lang="sql">
 +
select *
 +
  from v$object_usage
 +
where used = 'NO';
 +
</source>
 +
 +
List of indexes with segment size (query won't work nicely for partitioned objects)
 +
<source lang="sql">
 +
select u.index_name, u.table_name, round(s.bytes / 1048576) "MB", u.used
 +
  from v$object_usage u
 +
    , user_segments s
 +
where u.used = 'NO'
 +
  and s.segment_name = u.index_name
 +
order by s.bytes desc;
 +
</source>
 +
 +
List of indexes without segments (count of this query + previous query should equal the total)
 +
<source lang="sql">
 +
select u.index_name, i.segment_created
 +
  from v$object_usage u
 +
    , user_indexes i
 +
where u.used = 'NO'
 +
  and u.index_name not in (select segment_name from user_segments)
 +
  and i.index_name = u.index_name;
 
</source>
 
</source>

Latest revision as of 15:13, 6 April 2016

Setting up

Enable monitoring:

select 'alter index ' || owner || '.' || index_name || ' monitoring usage;'
  from dba_indexes
 where owner = '?'
   and index_type not in ('LOB');

Validate it has been enabled on all indexes (in case some were locked):

select index_name
  from user_indexes
 where index_type not in ('LOB')
minus
select index_name
   from v$object_usage;

Verify, make sure to connect as the owner of the objects you are monitoring:

select *
   from v$object_usage;

Querying

Total list

select *
  from v$object_usage
 where used = 'NO';

List of indexes with segment size (query won't work nicely for partitioned objects)

 
select u.index_name, u.table_name, round(s.bytes / 1048576) "MB", u.used
  from v$object_usage u
     , user_segments s
 where u.used = 'NO'
   and s.segment_name = u.index_name
 order by s.bytes desc;

List of indexes without segments (count of this query + previous query should equal the total)

select u.index_name, i.segment_created
  from v$object_usage u
     , user_indexes i
 where u.used = 'NO'
   and u.index_name not in (select segment_name from user_segments)
   and i.index_name = u.index_name;