本博客所有内容均为原创,如有转载请注明作者和出处

如何找出ORA-4031的元凶SQL

上一篇 / 下一篇  2008-03-26 11:50:47 / 个人分类:Oracle

 

4031的错误大部分是未绑定变量SQL语句引起的。排除DBbug后,就要从v$sqlareav$open_cursor中找出元凶sql语句。

 

元凶有两种:

 

1未绑定变量并且大量执行的sql,这种sql就是晶晶模拟出来的现象,参见

晶晶实验二十一:一个简单4031例子的引申。这种SQL可以通过如下查询抓出来。

先找出sql:

 

select count(*), sum(sharable_mem),substr(sql_text,50) from v$sqlarea group by substr(sql_text,50) order by 1,2;

 

substr取的字符的个数,根据应用进行调整。

 

然后根据找出的SQL确定是哪个应用执行的

 

select sid,sharable_mem,s.sql_text from v$open_cursor c , v$sqlarea s where c.hash_value =s.hash_value and s.sql_text like 'xxxxxxxx%'

 

2单条SQL需要大量内存空间,如果内存里有空间但是是由很多小空间碎片组成的话,当执行这个占用内存大的单条sql时,由于不能分配空间,而产生4031错误。这种sql一般来说都是够长够复杂的sql.可以通过如下SQL语句抓出来。

 

先找出sql

 

select sid,s.sharable_mem,s.sql_text,s.ADDRESS,s.HASH_VALUE from v$open_cursor c , v$sqlarea s where c.hash_value =s.hash_value order by sharable_mem;

 

通常sql_text不能把sql显示完整,用如下查询找出完整的sql.

 

select a.address,a.hash_value,a.piece,a.sql_text,a.command_type from v$sqltext a, (select sid,s.sharable_mem,s.sql_text,s.ADDRESS,s.HASH_VALUE from v$open_cursor c , v$sqlarea s where c.hash_value =s.hash_value and s.sharable_mem>xxxxx) b where a.address=b.address and a.hash_value=b.hash_value order by 1,2,3;

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-09  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 1483
  • 日志数: 22
  • 建立时间: 2008-01-07
  • 更新时间: 2008-04-24

RSS订阅

Open Toolbar