oracle视图建临时表,Oracle全局临时表

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

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

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

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

(一)临时表的特点

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

l 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。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];

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

SYS@lhrdb> CREATE GLOBAL TEMPORARY TABLE CGTT_DELETE_LHR AS SELECT * FROM SCOTT.EMP WHERE 1=2;

Table created.

SYS@lhrdb> INSERT INTO CGTT_DELETE_LHR SELECT * FROM SCOTT.EMP WHERE ROWNUM<=5;

5 rows created.

SYS@lhrdb> SELECT * FROM CGTT_DELETE_LHR;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

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

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30

7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30

7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20

7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30

SYS@lhrdb> COMMIT;

Commit complete.

SYS@lhrdb>  SELECT * FROM CGTT_DELETE_LHR;

no rows selected

从示例中可以看到,当执行完COMMIT后,当前会话就看不到数据了。

2、会话临时表

会话临时表,顾名思义,是指数据只在当前会话内是有效的临时表。关闭当前会话或者进行新的连接之后,数据表中的内容就会被清除。

CREATE GLOBAL TEMPORARY TABLE  TABLE_NAME

(COL1 TYPE1,COL2 TYPE2...)

ON COMMIT PRESERVE ROWS;

会话临时表示例如下所示:

SYS@lhrdb> CREATE GLOBAL TEMPORARY TABLE CGTT_PRESERVE_LHR ON COMMIT PRESERVE ROWS AS SELECT * FROM SCOTT.EMP WHERE 1=2;

Table created.

SYS@lhrdb> INSERT INTO CGTT_PRESERVE_LHR SELECT * FROM SCOTT.EMP WHERE ROWNUM<=5;

5 rows created.

SYS@lhrdb> SELECT * FROM CGTT_PRESERVE_LHR;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

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

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30

7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30

7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20

7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30

SYS@lhrdb> COMMIT;

Commit complete.

SYS@lhrdb> SELECT * FROM CGTT_PRESERVE_LHR;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- -

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值