WEB开发网
开发学院数据库Oracle 针对临时表与truncate错误的分析 阅读

针对临时表与truncate错误的分析

 2008-09-19 12:55:48 来源:WEB开发网   
核心提示:昨天晚上系统出现一个问题,一个存储过程执行异常,针对临时表与truncate错误的分析,观察仅仅发现逻辑读越越高,当时情况比较紧急,特别在临时表数据很小的情况下,实际上这个问题主要是开发人员根本没必要在存储过程中使用临时表,我只好将原来的修改成旧的样子, 实际上改动很简单

昨天晚上系统出现一个问题,一个存储过程执行异常,观察仅仅发现逻辑读越越高。当时情况比较紧急,我只好将原来的修改成旧的样子。

实际上改动很简单,新的如下: 

   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

Tags:针对 临时 truncate

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接