Oracle bug之v$access

今天在客户数据库查询一表格的访问情况,结果系统出现
[quote]SQL> /

EVENT
----------------------------------------------------------------
SQL*Net message to client
latch: library cache[/quote]
只能将查询语句ctrl+c
[quote]SQL> select count(*) from v$access where OWNER='HZ_YC' and OBJECT='W_HZ_QYHZNR';
^Cselect count(*) from v$access where OWNER='HZ_YC' and OBJECT='W_HZ_QYHZNR'
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation[/quote]
metalink一查。又准确命中一bug
[quote]Symptoms

Querying v$access leads to contention on library cache and almost freezing database.


Cause

As given in the Bug 5880432 closed as not a bug, this is a expected behaviour.

It is difficult to get a fix in current releases to reduce the latch gets required, as one off fixes
cannot change V$/X$ views. [/quote]
Oracle提供了一临时解决办法,就是替代v$accsee的创建脚本
[quote]REM Example for how it may be possible to reduce latch gets
REM needed to see SGA data like V$ACCESS

REM nahsh() is a function to compute the KGLNAHSH value for a REM given owner, name, namespace (ntyp)
REM OWNER is upper case owner
REM NAME is upper case object name
REM NTYP is numeric object namespace id - typically:
REM 1 for 'TABLE/PROCEDURE',
REM 2 for 'BODY',
REM 3 for 'TRIGGER',
REM 4 for 'INDEX',
REM 5 for 'CLUSTER',
REM 6 for 'OBJECT',
REM 7 for 'PIPE', REM 13 for 'JAVA SOURCE',
REM 14 for 'JAVA RESOURCE',
REM 32 for 'JAVA DATA'
REM This only function only works for little endian platforms (like Linux)
REM so cannot be used on HPUX. REM create or replace function nahsh( owner varchar2, name varchar2, ntyp number)
return number is
n number;
x1 raw(20);
x2 number;
begin
/* Little endian */
n:=dbms_utility.get_sql_hash(
name||'.'||owner||chr(ntyp)||chr(0)||chr(0)||chr(0),x1,x2);
/* Big endian
* In theory this but it gives wrong value so cannot use on big endian * platforms.
* n:=dbms_utility.get_sql_hash(
* name||'.'||owner||chr(0)||chr(0)||chr(0)||chr(ntyp),x1,x2);
*/
return(n);
end;
/
REM XX_acccess view like V$ACCESS but exposes NAHSH column
REM which can then be supplied in queries

create or replace view XX_access (
sid,owner,object,type,nahsh
) as select /*+ ORDERED */ distinct s.ksusenum,o.kglnaown,o.kglnaobj, decode(o.kglobtyp, 0, 'CURSOR', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER', 4, 'VIEW',
5, 'SYNONYM', 6, 'SEQUENCE', 7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE', 10,'NON-EXISTENT', 11,'PACKAGE BODY', 12,'TRIGGER', 13,'TYPE', 14,'TYPE BODY', 15,'OBJECT', 16,'USER', 17,'DBLINK', 18,'PIPE', 19,'TABLE PARTITION', 20,'INDEX PARTITION', 21,'LOB', 22,'LIBRARY', 23,'DIRECTORY', 24,'QUEUE', 25,'INDEX-ORGANIZED TABLE', 26,'REPLICATION OBJECT GROUP', 27,'REPLICATION PROPAGATOR', 28,'JAVA SOURCE', 29,'JAVA CLASS', 30,'JAVA RESOURCE', 31,'JAVA JAR', 'INVALID TYPE') ,
o.kglnahsh
from x$kglob o,x$kgllk l, x$kgldp d, x$ksuse s
where l.kgllkuse=s.addr and l.kgllkhdl=d.kglhdadr and l.kglnahsh=d.kglnahsh and o.kglnahsh=d.kglrfhsh and o.kglhdadr=d.kglrfhdl
and s.inst_id=USERENV('INSTANCE')
;
REM Example usage

REM V$ACCESS query
set timing on
select * from v$access where owner='SYS' and object='OBJ$' and type='TABLE'
/


REM Using XX_ACCESS
REM a. Get a hash value for the query REM On little endian use the function. On others you need to get
REM this from a lookup table or some other way.
REM variable n number
exec :n:=nahsh('SYS','OBJ$',1);

REM and run the query which includes NAHSH in the predicates
select * from xx_access where owner='SYS' and object='OBJ$' and type='TABLE'
and nahsh=:n /* Added predicate to get fixed index access on x$kglob */
; [/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值