当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
针对临时表与truncate错误的分析
发布时间:2011/1/26 16:22:37 来源:www.xue.net 编辑:城市总裁吧

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

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

  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(*)

  ----------

  0

  也就是将在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

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved