oracle 9i臨時表產生過多redo

space6212發表於2019-03-15

 今天遇到一個bug,對臨時表進行insert的時候產生異常多的redo,下面模擬過程:
 
 SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production

TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

 

--在會話1執行:
SQL> create global temporary table t1(id int) on commit preserve rows;

Table created

SQL> create global temporary table t2(id int) on commit delete rows;

Table created

SQL> create table t3(id int);

Table created

SQL> select * from v$statname where name='redo size';

STATISTIC# NAME                                                                  CLASS
---------- ---------------------------------------------------------------- ----------
       115 redo size                                                                 2


--新開一個會話2執行:

SQL> select * from v$mystat where rownum=1;

       SID STATISTIC#      VALUE
---------- ---------- ----------
        10          0          1

SQL>  insert into t1 select rownum from dual connect by rownum<500000;

499999 rows inserted


--在會話1查詢產生的redo量
SQL> select * from v$sesstat where sid=10 and statistic#=115;

       SID STATISTIC#      VALUE
---------- ---------- ----------
        10        115   62249712


--再會話2往t2插入資料
SQL> insert into t2 select rownum from dual connect by rownum<500000;

499999 rows inserted


--會話1中查詢此時的redo情況
SQL> select * from v$sesstat where sid=10 and statistic#=115;

       SID STATISTIC#      VALUE
---------- ---------- ----------
        10        115  124499216

       
--在會話1往普通表插入資料
SQL> insert into t3 select rownum from dual connect by rownum<500000;

499999 rows inserted

--會話1中查詢此時的redo情況
SQL> select * from v$sesstat where sid=10 and statistic#=115;

       SID STATISTIC#      VALUE
---------- ---------- ----------
        10        115  132242444

       

--產生的redo比較:
       
會話級臨時表:62249712
事務級臨時表:62249504
普通表      :7743228

可見,無論對事務級的臨時表還是會話級的臨時表,都產生遠比普通表多的redo,這是極不正常的。
臨時表的資料對於恢復是沒有任何用處的,所以,它不需要為insert的資料記錄redo資訊。因此,遇到上面的情況,十有八九是因為bug引起的。
查了一個metalink,確認這是一個bug:

Bug 2874489  Excessive REDO generated for INSERT as SELECT into GLOBAL TEMPORARY TABLES
 This note gives a brief overview of bug 2874489.

Using 'insert as select' to insert into a global
temporary table can generate far more redo than
the same insert into a permanent table.

Updates and deletes are not affected, only multirow inserts. 

這個 bug在9205後修正。
實際上,這個bug也影響undo的使用,對臨時表的操作佔用的undo遠比普通表多。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-119992/,如需轉載,請註明出處,否則將追究法律責任。

相關文章