Well, it's not a perfect solution but the following query will show you what is in your buffer pool (v$bh) and match it to each objects total segment size and give you a report of what is really taking up the buffer pool and was percent of each object is in memory. It's not a perfect (old old old) script but the output can be enlightening. If you see indexes that are large but not much of it is in memory, well, you can draw your own conclusions. I have been using versions of this script since oracle 7-something but haven't run it in v9. Have fun......
set verify off set pagesize 36 set linesize 132 set pause off set pause 'Hit enter to continue' set feedback off set showmode off set echo off REM ---------------------------------------------------------------------------- col db_block_size new_value nv_db_block_size noprint select value db_block_size from v$parameter where name = 'db_block_size'; REM ---------------------------------------------------------------------------- ttitle "V$BH, Ordered by Status and Count" col status format a10 heading "Block|Status|Types" col status2 format a25 heading "Block|Status|Description" col block_status format a32 heading "------Block Status Details------|Dirty-Temp-Ping-Stale-Direct-New" col cnt format 99999999 heading "Blocks" col sga_kbytes format 99999999 heading "Kbytes" col sga_mbytes format 99999999 heading "Mbytes" compute sum of cnt on report compute sum of sga_kbytes on report compute sum of sga_mbytes on report break on report select count(*) cnt, count(*) * (&nv_db_block_size / 1024) sga_kbytes, trunc((count(*) * (&nv_db_block_size / 1024)) / 1024) sga_mbytes, status, decode(upper(status), 'FREE', 'not currently in use', 'XCUR', 'exclusive', 'SCUR', 'shared current', 'CR', 'consistent read', 'READ', 'being read from disk', 'MREC', 'in media recovery mode', 'IREC', 'in instance recovery mode', 'UNKNOWN') status2, dirty || ' ' || temp || ' ' || ping || ' ' || stale || ' ' || direct || ' ' || new block_status from v$bh group by status, dirty || ' ' || temp || ' ' || ping || ' ' || stale || ' ' || direct || ' ' || new order by 2,1; clear break clear compute REM ---------------------------------------------------------------------------- ttitle off set pause off PROMPT PROMPT Sort BY Selections prompt For DB Buffer Cache Map PROMPT ------------------------ PROMPT 1 = Object Owner PROMPT 2 = Object Name PROMPT 3 = Object Type PROMPT 4 = SGA Blocks PROMPT 5 = SGA KBytes PROMPT 6 = Segment KBytes PROMPT 7 = Percent in SGA ACCEPT USER_INPUT1 NUMBER PROMPT 'Please enter one now:>' col sort_by_number new_value sort_by_number_value noprint col sort_by_text new_value sort_by_text_value noprint select decode(&USER_INPUT1, 1,1, 2,2, 3,3, 4,4, 5,5, 6,7, 7,9, 4) sort_by_number, decode(&USER_INPUT1, 1, 'Object Owner', 2,'Object Name', 3,'Object Type', 4,'SGA Blocks', 5,'SGA KBytes', 6,'Segment KBytes', 7,'Percent in SGA', 'SGA Blocks') sort_by_text from dual; REM ---------------------------------------------------------------------------- PROMPT PROMPT Sort ORDER Selections PROMPT --------------------- PROMPT 1 = Descending PROMPT 2 = Ascending ACCEPT USER_INPUT2 NUMBER PROMPT 'Please enter one now:>' col order_by_text new_value order_by_text_value noprint select decode(&USER_INPUT2, 1,'Desc', 2,'Asc', 'Desc') order_by_text from dual; REM ---------------------------------------------------------------------------- ACCEPT USER_INPUT3 CHAR PROMPT 'Include SYS objects (Y/N):>' col include_sys new_value nv_include_sys noprint select decode(upper('&USER_INPUT3'), 'Y','Y', 'N') include_sys from dual; REM ---------------------------------------------------------------------------- set feedback on create table tmp_v$cache as select owner#, name, kind, partition_name, count(*) sga_cnt, count(*) * (&nv_db_block_size / 1024) sga_kb from v$cache group by owner#, name, kind, partition_name; create index tmp_v$cache_idx on tmp_v$cache(owner#, name, kind, partition_name, sga_cnt, sga_kb); analyze table tmp_v$cache compute statistics for table for all indexes for all indexed columns; create table tmp_dba_users as select user_id, username from dba_users; create index tmp_dba_users_idx on tmp_dba_users(user_id, username); analyze table tmp_dba_users compute statistics for table for all indexes for all indexed columns; create table tmp_dba_segments as select owner, segment_name, segment_type, partition_name, blocks * (&nv_db_block_size / 1024) seg_kb from dba_segments; create index tmp_dba_segments_idx on tmp_dba_segments(owner, segment_name, segment_type, partition_name, seg_kb); analyze table tmp_dba_segments compute statistics for table for all indexes for all indexed columns; REM ---------------------------------------------------------------------------- PROMPT spooling output to /tmp/tool_db_buffer_map2_&1..lst PROMPT PROMPT Working, please wait... set feedback off termout off spool /tmp/tool_db_buffer_map2_&1..lst ttitle 'Sga Usage, Ordered by &sort_by_text_value &order_by_text_value ' col username heading 'Object Owner' format a20 col name heading 'Object Name' format a40 col kind heading 'Object Type' col sga_cnt heading 'SGA|Blocks' format 9999999 col sga_kb heading 'SGA|KBytes' format 999999 col sga_mb heading 'SGA|MBytes' format 99999 col seg_kb heading 'Segment|KBytes' format 9999999 col seg_mb heading 'Segment|MBytes' format 99999 col pct_load heading 'Pct In|SGA' format 999.999 select /*+ RULE */ B.username username, nvl(substr(A.name || decode(A.partition_name,NULL,NULL,'.' || A.partition_name ),1,40 ), 'FREE BLOCKS' ) name , A.kind kind , A.sga_cnt sga_cnt , A.sga_kb sga_kb , trunc(A.sga_kb / 1024) sga_mb , C.seg_kb seg_kb , trunc(C.seg_kb / 1024) seg_mb , (A.sga_kb / C.seg_kb) * 100 pct_load from tmp_dba_segments C, tmp_dba_users B, tmp_v$cache A where A.owner# = B.user_id and ((B.username != 'SYS' ) or (B.username = 'SYS' and '&nv_include_sys' = 'Y') ) and B.username = C.owner and A.name = C.segment_name and A.kind = C.segment_type and nvl(A.partition_name,'NULL') = nvl(C.partition_name,'NULL') union all select /*+ RULE */ C.owner username, nvl(substr(C.segment_name || decode(C.partition_name,NULL,NULL,'.' || C.partition_name ),1,40 ), 'FREE BLOCKS' ) name , C.segment_type kind , 0 sga_cnt , 0 sga_kb , 0 sga_mb , C.seg_kb seg_kb , trunc(C.seg_kb / 1024) seg_mb , 0 pct_load from tmp_dba_segments C where ((C.owner != 'SYS' ) or (C.owner = 'SYS' and '&nv_include_sys' = 'Y') ) and (C.owner || C.segment_name || C.segment_type || C.partition_name) not in (select B.username || A.name || A.kind || A.partition_name from tmp_dba_users B, tmp_v$cache A where A.owner# = B.user_id and ((B.username != 'SYS' ) or (B.username = 'SYS' and '&nv_include_sys' = 'Y') ) ) order by &sort_by_number_value &order_by_text_value, 1,2; spool off ttitle off set feedback on termout on drop table tmp_dba_segments; drop table tmp_dba_users; drop table tmp_v$cache; [EMAIL PROTECTED] ys.com To: Multiple recipients of list ORACLE-L <[EMAIL PROTECTED]> Sent by: cc: [EMAIL PROTECTED] Subject: Re: ** find whether table or index being accessed .com 11/18/2003 01:59 PM Please respond to ORACLE-L ... but the database is 8.1.7 - no monitoring allowed Mladen Gogala <[EMAIL PROTECTED]> To: Multiple recipients of Sent by: list ORACLE-L <[EMAIL PROTECTED]> [EMAIL PROTECTED] cc: Subject: Re: ** find whether table or index being accessed 11/18/2003 12:44 PM Please respond to ORACLE-L Well, 'ALTER INDEX MONITORING USAGE' should do the trick. Results should be in V$OBJECT_USAGE. In connection to that, here is a sweet little bug in oracle 9.2.0.4: SQL> select name from v$fixed_table where name='V$OBJECT_USAGE'; no rows selected Don't tell that to oracle, they might even fix it. On 11/18/2003 02:34:28 PM, DENNIS WILLIAMS wrote: > A - The only suggestion I've heard is to take the contents of V$SQL, perform > EXPLAIN PLAN on all SQL, and try to build a list of indexes that are used. > Hardly foolproof. I think Burleson has some scripts in his book Oracle > High-Performance Tuning With STATSPACK, IIRC. > > > > Dennis Williams > DBA > Lifetouch, Inc. > [EMAIL PROTECTED] > > -----Original Message----- > Sent: Tuesday, November 18, 2003 11:49 AM > To: Multiple recipients of list ORACLE-L > > > Hi, > I had sent this some time back but got no answer for version 8.1.7. For > table I understand auditing is an option. What about for index? Thank You > > A Joshi <[EMAIL PROTECTED]> wrote: > > Hi, > Is there an easy way to find out if a table or an index is being used. I > mean short of going thru all code or keeping looking at v$sqlarea. I mean > even if code is covered there are always ad hoc SQL queries etc. Same for > other objects like views etc. Is there a place where oracle stores objects > accessed and any other related info. > > Thanks > > > > > > _____ > > Do you Yahoo!? > Yahoo! <http://us.rd.yahoo.com/evt=10469/*http://sitebuilder.yahoo.com> > SiteBuilder - Free, easy-to-use web site design software > > > > _____ > > Do you Yahoo!? > Protect <http://antispam.yahoo.com/whatsnewfree> your identity with Yahoo! > Mail AddressGuard > > -- > Please see the official ORACLE-L FAQ: http://www.orafaq.net > -- > Author: DENNIS WILLIAMS > INET: [EMAIL PROTECTED] > > Fat City Network Services -- 858-538-5051 http://www.fatcity.com > San Diego, California -- Mailing list and web hosting services > --------------------------------------------------------------------- > To REMOVE yourself from this mailing list, send an E-Mail message > to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in > the message BODY, include a line containing: UNSUB ORACLE-L > (or the name of mailing list you want to be removed from). You may > also send the HELP command for other information (like subscribing). > Mladen Gogala Oracle DBA Note: This message is for the named person's use only. It may contain confidential, proprietary or legally privileged information. No confidentiality or privilege is waived or lost by any mistransmission. If you receive this message in error, please immediately delete it and all copies of it from your system, destroy any hard copies of it and notify the sender. You must not, directly or indirectly, use, disclose, distribute, print, or copy any part of this message if you are not the intended recipient. Wang Trading LLC and any of its subsidiaries each reserve the right to monitor all e-mail communications through its networks. Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorized to state them to be the views of any such entity. -- Please see the official ORACLE-L FAQ: http://www.orafaq.net -- Author: Mladen Gogala INET: [EMAIL PROTECTED] Fat City Network Services -- 858-538-5051 http://www.fatcity.com San Diego, California -- Mailing list and web hosting services --------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing). -- Please see the official ORACLE-L FAQ: http://www.orafaq.net -- Author: INET: [EMAIL PROTECTED] Fat City Network Services -- 858-538-5051 http://www.fatcity.com San Diego, California -- Mailing list and web hosting services --------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).