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).