数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

如何找出引起ORA-1652的SQL


发布日期:2019年11月23日
 
如何找出引起ORA-1652的SQL

本文讲解了如何找出引起ORA的SQL要解决这个问题首先我们要找出导致这个问题的SQL再进行处理

在alert文件中我们可能会看到这样的报错信息

Wed Aug ::

ORA: unable to extend temp segment by in tablespace DBA_TEMP

要解决这个问题我们首先要导致这个问题的SQL可能方法有几种

设置events

alter system set events trace name errorstack level ;

这种方法有一定局限

)它不能获取已发生的的错误信息只能对以后出现错误时生成一个trace文件;

)用events不清楚会对数据库有什么不好的影响

查询V$SQL视图

如select * from v$sql order by direct_writes/executions desc;

这种方法的局限性是

)因为很难知道V$SQL视图中的SQL执行时间难以确认具体是那个SQL导致错误的

)引起问题的SQL极有可能已经被age out了

生成错误发生时的awrstatspack报表从报表中的SQL ordered by Reads部分找出SQL

这种方法更不可靠因为

) SQL ordered by Reads读写的不一定是临时表空间

) awr/statspack报表是根据物理读的总量排序的如果导致问题的SQL执行次数少那也是不会出现在这些报表中的

查询awr相关视图

对于G来说这种方法是最可行最准确的

SELECT DISTINCT TO_CHAR(SUBSTR(bsql_text))

FROM sysWRH$_SQLTEXT b

WHERE bsql_id IN

(SELECT sql_id

FROM

(SELECT asql_id

FROM sysWRH$_SQLSTAT a

WHERE aparsing_schema_name NOT IN (SYS)

AND aexecutions_total >

AND adirect_writes_total >

AND aSNAP_ID IN

(SELECT SNAP_ID

FROM sysWRM$_SNAPSHOT

WHERE to_date(:: ::yyyy:mm:dd hh:mi:ss) BETWEEN begin_interval_time AND end_interval_time

)

ORDER BY adirect_writes_total/ aexecutions_total DESC

)

WHERE rownum<=

);

基本上结果中的第一句只要不是insert /*+ append */之类的语句那么它就极有可能是导致ORA的SQL

如果是i用statspack也可以用类似的SQL从statspack视图查到需要的结果

上一篇:在PB中用OLE存取blob类型数据(二)

下一篇:在PB中用OLE存取blob类型数据(三)