程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> 如何找出引起ORA-1652的SQL

如何找出引起ORA-1652的SQL

編輯:關於Oracle數據庫

    Wed Aug 20 17:16:37 2008
    ORA-1652: unable to extend temp segment by 128 in tablespace DBA_TEMP

    要解決這個問題,我們首先要導致這個問題的SQL,可能方法有幾種:

    1、設置events

    alter system set events '1652 trace name errorstack level 1';

    這種方法有一定局限:

    1)它不能獲取已發生的1652的錯誤信息,只能對以後出現1652錯誤時生成一個trace文件;

    2)用events,不清楚會對數據庫有什麼不好的影響。

    2、查詢V$SQL視圖:

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

    這種方法的局限性是:

    1)因為很難知道V$SQL視圖中的SQL執行時間,難以確認具體是那個SQL導致錯誤的

    2)引起問題的SQL極有可能已經被age out了

    3、 生成錯誤發生時的awr、statspack報表,從報表中的SQL ordered by Reads部分找出SQL

    這種方法更不可靠,因為:

    1) SQL ordered by Reads讀寫的不一定是臨時表空間

    2) awr/statspack報表是根據物理讀的總量排序的,如果導致問題的SQL執行次數少,那也是不會出現在這些報表中的。

    4、查詢awr相關視圖

    對於10G來說,這種方法是最可行、最准確的。

    SELECT DISTINCT TO_CHAR(SUBSTR(b.sql_text,1,4000))
    FROM sys.WRH$_SQLTEXT b
    WHERE b.sql_id IN
    (SELECT sql_id
    FROM
    (SELECT a.sql_id
    FROM sys.WRH$_SQLSTAT a
    WHERE a.parsing_schema_name NOT IN ('SYS')
    AND a.executions_total >0
    AND a.direct_writes_total >0
    AND a.SNAP_ID IN
    (SELECT SNAP_ID
    FROM sys.WRM$_SNAPSHOT
    WHERE to_date('2008:08:20 17:20:08','yyyy:mm:dd hh24:mi:ss') BETWEEN begin_interval_time AND end_interval_time
    )
    ORDER BY a.direct_writes_total/ a.executions_total DESC
    )
    WHERE rownum<=10
    );

    基本上,結果中的第一句只要不是insert /*+ append */之類的語句,那麼它就極有可能是導致ORA-1652的SQL。

    如果是9i,用statspack,也可以用類似的SQL從statspack視圖查到需要的結果。


    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved