针对临时表与truncate错误的分析
2008-09-19 12:55:48 来源:WEB开发网昨天晚上系统出现一个问题,一个存储过程执行异常,观察仅仅发现逻辑读越越高。当时情况比较紧急,我只好将原来的修改成旧的样子。
实际上改动很简单,新的如下:
EXECUTEIMMEDIATE'TRUNCATETABLEtemp_testREUSESTORAGE‘;
旧的如下:
deletefromTEMP_TEST;
TEMP_TEST 是一个临时表。
今天上午测试才发现临时表在truncate时与正常表不同。
测试实验如下:
sleect*fromv$version
BANNER
----------------------------------------------------------------
Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production
PL/SQLRelease9.2.0.1.0-Production
CORE9.2.0.1.0Production
TNSfor32-bitWindows:Version9.2.0.1.0-Production
NLSRTLVersion9.2.0.1.0-Production
CREATEGLOBALTEMPORARYTABLETEMP_TEST
(
TEST_IDVARCHAR2(30BYTE)NOTNULL,
TEST_COUNTNUMBER(10)
)
ONCOMMITPRESERVEROWS
NOCACHE;
插入一些数据:
INSERTINTOtemp_testSELECTtable_nametest_id,pct_freetest_countFROMuser_tables;
commit;
>selectcount(*)fromtemp_test;
COUNT(*)
----------
10
>TRUNCATETABLEtemp_testREUSESTORAGE;
Tabletruncated.
>selectcount(*)fromtemp_test;
COUNT(*)
----------
10
>TRUNCATETABLEtemp_test;
Tabletruncated.
>selectcount(*)fromtemp_test;
COUNT(*)
----------
0
也就是将在9i的这个版本下,truncate使用 REUSE STORAGE , DROP STORAGE 都不能删除记录,按照道理DROP STORAGE 应该可以,也许是某个bug.不过最后我发现使用delete还是好一些。truncate table 代替delete,虽然日志很少,但是相对的递归,读取还是很多,特别在临时表数据很小的情况下。实际上这个问题主要是开发人员根本没必要在存储过程中使用临时表,而且还执行delete操作。
在10g下:
TRUNCATETABLEtemp_testREUSESTORAGE;
ERRORatline1:
ORA-14461:cannotREUSESTORAGEonatemporarytableTRUNCATE
TRUNCATETABLEtemp_testdropstorage;
Tabletruncated.
>selectcount(*)fromtemp_test;
0
更多精彩
赞助商链接