oracle 9i臨時表產生過多redo
今天遇到一個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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle日常問題-臨時表過多導致exp速度慢Oracle
- ORACLE臨時表總結Oracle
- oracle 臨時表的使用Oracle
- Oracle 臨時表 OracleDataAdapter 批次更新OracleAPT
- Oracle臨時表使用注意事項Oracle
- oracle臨時表空間相關Oracle
- Oracle臨時表的用法總結FLOracle
- Oracle臨時表空間檢視、新增臨時表空間資料檔案、修改預設臨時表空間 方法!Oracle
- oracle之 redo過高診斷Oracle
- 25_解密Oracle redo生成過程解密Oracle Redo
- oracle 臨時表空間的增刪改查Oracle
- 【REDO】Oracle redo advice-sqlOracle RedoSQL
- 【REDO】Oracle redo undo 學習Oracle Redo
- 在oracle 9i下線上重定義表Oracle
- Oracle Redo and UndoOracle Redo
- 【REDO】Oracle redo內部結構Oracle Redo
- MySQL臨時表MySql
- PostgreSQL:臨時表SQL
- 檢視oracle臨時表空間佔用率的檢視Oracle
- 如何追蹤產生大量REDO的來源
- oracle建立臨時表空間和資料表空間以及刪除Oracle
- Oracle redo解析之-1、oracle redo log結構計算Oracle Redo
- Mac OS X 避免產生臨時檔案 .DS_StoreMac
- MySQL之臨時表MySql
- mysql 建立臨時表MySql
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- oracle11g 查詢臨時表空間的使用率和正在使用臨時表空間的使用者Oracle
- MySQL 5.7 新特性 共享臨時表空間及臨時表改進MySql
- SQL Server通過建立臨時表遍歷更新資料SQLServer
- mysql臨時表,臨時表空間,ibtmp1表空間暴增原因初探MySql
- SQLServer臨時表的使用SQLServer
- MySQL 中的臨時表MySql
- Oracle 12C RMAN備份佔用大量臨時表空間Oracle
- oracle的redo和undoOracle
- MySQL時區導致無法產生表MySql
- 你好奇過 MySQL 內部臨時表存了什麼嗎?MySql
- Oracle 12CR2查詢轉換之cursor-duration臨時表Oracle
- oracle 線上調整redoOracle