临时表小结

4 篇文章 0 订阅

使用物理表的问题:

1、回滚段很大,大量的insert 后又delete是会占用大量回滚段,要清空表的话用truncate,truncate不会产生回滚段。 回滚段多、大会对数据库会产生很大压力。遇到并发查询多情况下,性能会下降非常高【达梦数据库遇到的问题】
2、 频繁插入数据又删除,会造成高水位问题,表为空,但是占用大量表空间不释放。【Oracle物理表频繁删除会到的问题】

如何创建创建临时表

--基于事务的临时表
create global temporary table test
(
  ID   number
)
on commit delete rows;

--基于session的临时表
create global temporary table test
(
  ID   number
)
on commit preserve rows;
  1. 临时表分类

ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。

  • 事务级的临时表 ON COMMIT DELETE ROWS

    临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMIT)后,临时表的将被自动截断(TRUNCATE)

SQL> CREATE GLOBAL TEMPORARY TABLE TEMPTABLE_TEST

 (

     ID NUMBER ,

     NAME VARCHAR2(32)

 ) ON COMMIT DELETE ROWS;

Table created

SQL> INSERT INTO TEMPTABLE_TEST

   SELECT 1, 'adaivskenan' FROM DUAL;

1 row inserted

SQL> SELECT * FROM TEMPTABLE_TEST;

ID           NAME

---------- ---------------------

1 adaivskenan

SQL> COMMIT;

Commit complete

SQL> SELECT * FROM TEMPTABLE_TEST;

ID           NAME

---------- -----------------------

  • 会话级的临时表 ON COMMIT PRESERVE ROWS

    会话级的临时表的数据和当前会话有关系,当前SESSION不退出的情况下,临时表中的数据就还存在,临时表的数据只有当退出当前SESSION的时候才被截断(TRUNCATE TABLE)

    操作示例:

SQL> CREATE GLOBAL TEMPORARY TABLE TEMPTABLE_TEST
 (

   ID NUMBER ,

   NAME VARCHAR2(32)

 ) ON COMMIT PRESERVE ROWS;

Table created

SQL> INSERT INTO TEMPTABLE_TEST

    SELECT 1, 'adaivskenan' FROM DUAL;

1 row inserted

SQL> COMMIT;

Commit complete

SQL> SELECT * FROM TEMPTABLE_TEST;

ID         NAME

---------- ----------------

1 adaivskenan

SQL> INSERT INTO TEMPTABLE_TEST

   SELECT 2, 'adaivskenan' FROM DUAL;

1 row inserted

SQL> ROLLBACK;

Rollback complete

SQL> SELECT * FROM TEMPTABLE_TEST;

ID           NAME

---------- ----------------------

1           adaivskenan

SQL>
--用sys用户登录数据库,打开SESSION 2
--SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TEMPTABLE_TEST' --可以查到临时表数据
--SELECT * FROM TEMPTABLE_TEST; --查不到数据,即使TEMPTABLE_TEST临时表存在数据。

  1. 事务级临时表用途

为了提高查询效率,程序查询存在多选条件时,sql where条件中存在大量的in查询。通过将条件参数插入临时表,通过临时表暂存
条件提示查询效率。

  1. 会话级存在的问题

业务系统为提升效率都会使用数据库连接池,使用连接池时连接数据库的session只会归还给连接池。如果使用基于session的临时表,每次操作完表数据库不自动做删除操作,会造成数据累积,导致业务数据查询出现错误。

如果要DROP会话级别临时表,并且其中包含数据时,必须先截断其中的数据。否则会报错。

SQL> DROP TABLE TEMPTABLE_TEST PURGE;
DROP TABLE TEMPTABLE_TEST PURGE
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
SQL> TRUNCATE TABLE TEMPTABLE_TEST;
Table truncated
SQL> DROP TABLE TEMPTABLE_TEST PURGE;
Table dropped
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值