暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中,什么是临时表?它有哪些分类?有关临时表需要注意什么?

DB宝 2019-03-05
844


题目部分

在Oracle中,什么是临时表?它有哪些分类?有关临时表需要注意什么?


     

答案部分


目前所有使用Oracle作为数据库支撑平台的应用,大部分是数据量比较庞大的系统,即表的数据量级一般情况下都是在百万级以上。当然,在Oracle中创建分区是一种不错的选择,但是当发现应用有多张表关联的时候,并且这些表大部分都比较庞大,而关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小,并且查询得到这个结果集的速度非常快,那么这个时候考虑在Oracle中创建“临时表”。

在创建数据表的时候,如果没有特殊地指明,那么创建的表是一个永久的关系型表,也就是说,这个表中对应的数据,除非是显式地删除,否则表中的数据是永远都存在的。相对应的,在Oracle数据库中,还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远地存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动清除。

Oracle的临时表创建之后基本不占用表空间,如果没有指定临时表(包括临时表的索引)存放的表空间,那么插入到临时表的数据是存放在Oracle系统的默认临时表空间中(TEMP),一个系统可能有多个临时表空间。临时表的数据只能存放在临时表空间中。

临时表的数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在会话的数据对于当前会话私有每个会话只能看到并修改自己的数据。DML锁不会加到临时表的数据上。可以对临时表创建索引视图、触发器,可以用expimp工具导入导出表的定义,但是不能导出数据。

(一)临时表的特点

① 多用户操作的独立性:对于使用同一张临时表的不同用户,Oracle都会分配一个独立的TEMP SEGMENT,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性。

② 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。Oracle根据创建临时表时指定的参数(ON COMMIT DELETE ROWS ON COMMIT PRESERVE ROWS),自动将数据TRUNCATE掉。

(二)临时表的分类

Oracle数据库根据临时表的性质不同,可以分为事务临时表(ON COMMIT DELETE ROWS)与会话临时表(ON COMMIT PRESERVE ROWS)。

1、事务临时表

事务临时表是指数据只有在当前事务内有效,该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自动被清空,其它的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表的数据也会被清空)。一般情况下,如果在创建数据表的时候,没有特殊指明表是会话临时表的话,那么该表默认为事务临时表。

以下三种情况下,事务临时表中的数据就会被清空:

① 提交事务(COMMIT

② 回滚事务(ROLLBACK

③ 退出SESSION

创建事务临时表的语法如下所示

CREATE GLOBAL TEMPORARY TABLE  TABLE_NAME

(COL1 TYPE1,COL2 TYPE2...)

[ON COMMIT DELETE ROWS];

事务临时表示例如下所示:

 1SYS@lhrdb> CREATE GLOBAL TEMPORARY TABLE CGTT_DELETE_LHR AS SELECT * FROM SCOTT.EMP WHERE 1=2;
2Table created.
3SYS@lhrdb> INSERT INTO CGTT_DELETE_LHR SELECT * FROM SCOTT.EMP WHERE ROWNUM<=5;
45 rows created.
5SYS@lhrdb> SELECT * FROM CGTT_DELETE_LHR;
6     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
7---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
8      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
9      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
10      7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
11      7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
12      7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
13SYS@lhrdb> COMMIT;
14Commit complete.
15SYS@lhrdb>  SELECT * FROM CGTT_DELETE_LHR;
16no rows selected


从示例中可以看到,当执行完COMMIT后,当前会话就看不到数据了。
最后修改时间:2020-01-10 20:16:23
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论