昨天晚上系统出现一个问题,一个存储过程执行异常,观察仅仅发现逻辑读越越高。当时情况比较紧急,我只好将原来的修改成旧的样子。
实际上改动很简单,新的如下:
EXECUTE IMMEDIATE 'TRUNCATE TABLE temp_test REUSE STORAGE ‘ ;
旧的如下:
delete from TEMP_TEST ;
TEMP_TEST 是一个临时表。
今天上午测试才发现临时表在truncate时与正常表不同。
测试实验如下:
sleect * 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
CREATE GLOBAL TEMPORARY TABLE TEMP_TEST
(
TEST_ID VARCHAR2(30 BYTE) NOT NULL,
TEST_COUNT NUMBER(10)
)
ON COMMIT PRESERVE ROWS
NOCACHE;
插入一些数据:
INSERT INTO temp_test SELECT table_name test_id, pct_free test_count FROM user_tables;
commit ;
> select count(*) from temp_test ;
COUNT(*)
----------
10
> TRUNCATE TABLE temp_test REUSE STORAGE ;
Table truncated.
> select count(*) from temp_test ;
COUNT(*)
----------
10
> TRUNCATE TABLE temp_test ;
Table truncated.
> select count(*) from temp_test ;
COUNT(*)
----------
10
也就是将在9i的这个版本下,truncate使用 REUSE STORAGE , DROP STORAGE 都不能删除记录,按照道理DROP STORAGE 应该可以,也许是某个bug.不过最后我发现使用delete还是好一些。truncate table 代替delete,虽然日志很少,但是相对的递归,读取还是很多,特别在临时表数据很小的情况下。实际上这个问题主要是开发人员根本没必要在存储过程中使用临时表,而且还执行delete操作。
在10g下:
TRUNCATE TABLE temp_test REUSE STORAGE ;
ERROR at line 1:
ORA-14461: cannot REUSE STORAGE on a temporary table TRUNCATE
TRUNCATE TABLE temp_test drop storage ;
Table truncated.
> select count(*) from temp_test ;
0
顺便找到一个链接关于Temporary Table Questions
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5243764001269
实际上改动很简单,新的如下:
EXECUTE IMMEDIATE 'TRUNCATE TABLE temp_test REUSE STORAGE ‘ ;
旧的如下:
delete from TEMP_TEST ;
TEMP_TEST 是一个临时表。
今天上午测试才发现临时表在truncate时与正常表不同。
测试实验如下:
sleect * 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
CREATE GLOBAL TEMPORARY TABLE TEMP_TEST
(
TEST_ID VARCHAR2(30 BYTE) NOT NULL,
TEST_COUNT NUMBER(10)
)
ON COMMIT PRESERVE ROWS
NOCACHE;
插入一些数据:
INSERT INTO temp_test SELECT table_name test_id, pct_free test_count FROM user_tables;
commit ;
> select count(*) from temp_test ;
COUNT(*)
----------
10
> TRUNCATE TABLE temp_test REUSE STORAGE ;
Table truncated.
> select count(*) from temp_test ;
COUNT(*)
----------
10
> TRUNCATE TABLE temp_test ;
Table truncated.
> select count(*) from temp_test ;
COUNT(*)
----------
10
也就是将在9i的这个版本下,truncate使用 REUSE STORAGE , DROP STORAGE 都不能删除记录,按照道理DROP STORAGE 应该可以,也许是某个bug.不过最后我发现使用delete还是好一些。truncate table 代替delete,虽然日志很少,但是相对的递归,读取还是很多,特别在临时表数据很小的情况下。实际上这个问题主要是开发人员根本没必要在存储过程中使用临时表,而且还执行delete操作。
在10g下:
TRUNCATE TABLE temp_test REUSE STORAGE ;
ERROR at line 1:
ORA-14461: cannot REUSE STORAGE on a temporary table TRUNCATE
TRUNCATE TABLE temp_test drop storage ;
Table truncated.
> select count(*) from temp_test ;
0
顺便找到一个链接关于Temporary Table Questions
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5243764001269