如何找出引起ORA-1652的SQL

字號(hào):


    Wed Aug 20 17:16:37 2008
    ORA-1652: unable to extend temp segment by 128 in tablespace DBA_TEMP
    要解決這個(gè)問(wèn)題,我們首先要導(dǎo)致這個(gè)問(wèn)題的SQL,可能方法有幾種:
    1、設(shè)置events
    alter system set events '1652 trace name errorstack level 1';
    這種方法有一定局限:
    1)它不能獲取已發(fā)生的1652的錯(cuò)誤信息,只能對(duì)以后出現(xiàn)1652錯(cuò)誤時(shí)生成一個(gè)trace文件;
    2)用events,不清楚會(huì)對(duì)數(shù)據(jù)庫(kù)有什么不好的影響。
    2、查詢V$SQL視圖:
    如select * from v$sql order by direct_writes/executions desc;
    這種方法的局限性是:
    1)因?yàn)楹茈y知道V$SQL視圖中的SQL執(zhí)行時(shí)間,難以確認(rèn)具體是那個(gè)SQL導(dǎo)致錯(cuò)誤的
    2)引起問(wèn)題的SQL極有可能已經(jīng)被age out了
    3、 生成錯(cuò)誤發(fā)生時(shí)的awr、statspack報(bào)表,從報(bào)表中的SQL ordered by Reads部分找出SQL
    這種方法更不可靠,因?yàn)椋?BR>    1) SQL ordered by Reads讀寫(xiě)的不一定是臨時(shí)表空間
    2) awr/statspack報(bào)表是根據(jù)物理讀的總量排序的,如果導(dǎo)致問(wèn)題的SQL執(zhí)行次數(shù)少,那也是不會(huì)出現(xiàn)在這些報(bào)表中的。
    4、查詢awr相關(guān)視圖
    對(duì)于10G來(lái)說(shuō),這種方法是最可行、最準(zhǔn)確的。
    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
    );
    基本上,結(jié)果中的第一句只要不是insert /*+ append */之類(lèi)的語(yǔ)句,那么它就極有可能是導(dǎo)致ORA-1652的SQL。
    如果是9i,用statspack,也可以用類(lèi)似的SQL從statspack視圖查到需要的結(jié)果。