临时表与truncate

简介: 昨天晚上系统出现一个问题,一个存储过程执行异常,观察仅仅发现逻辑读越越高。当时情况比较紧急,我只好将原来的修改成旧的样子。实际上改动很简单,新的如下:EXECUTE IMMEDIATE 'TRUNCATE TABLE temp_test REUSE STORAGE  ‘ ;旧的如下:delete from  TEMP_TEST ;TEMP_TEST 是一个临时表。
昨天晚上系统出现一个问题,一个存储过程执行异常,观察仅仅发现逻辑读越越高。当时情况比较紧急,我只好将原来的修改成旧的样子。

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

目录
相关文章
|
18天前
|
SQL 关系型数据库 MySQL
关系型数据库使用 TRUNCATE TABLE 语句
`TRUNCATE TABLE` SQL 语句快速删除表所有记录,不记录删除操作,通常比 `DELETE` 快。不触发 DELETE 触发器,可能重置自增字段,并产生较少日志。语法:`TRUNCATE TABLE 表名`。注意:不可回滚,不激活触发器,慎用,确保数据不可恢复。考虑使用 `DELETE` 当需保留触发器功能或删除特定条件的行。
22 1
|
12月前
|
关系型数据库 MySQL 数据库
|
SQL 关系型数据库 MySQL
是谁,把InnoDB表上的DML搞慢的?
是谁,把InnoDB表上的DML搞慢的?
106 0
是谁,把InnoDB表上的DML搞慢的?
|
SQL Oracle 关系型数据库
truncate表后恢复方法总结
truncate表后恢复方法总结   1.1  BLOG文档结构图   1.2  前言部分   1.
1672 0
|
SQL Oracle 关系型数据库
[20180423]关于闪回表与主外键约束.txt
[20180423]关于闪回表与主外键约束.txt --//上个星期做的测试,可以发现删除表在恢复主外键约束丢失. --//链接:http://blog.itpub.
1087 0
|
存储 Oracle 关系型数据库

热门文章

最新文章