ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 临时表与truncate

临时表与truncate

原创 Linux操作系统 作者:lfree 时间:2008-09-11 09:38:21 0 删除 编辑
昨天晚上系统出现一个问题,一个存储过程执行异常,观察仅仅发现逻辑读越越高。当时情况比较紧急,我只好将原来的修改成旧的样子。

实际上改动很简单,新的如下:
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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-444217/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969542