`

Oracle的临时表使用讲解

 
阅读更多

临时表概念

   临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别。它只能存储在临时表空间,而非用户的表空间。ORACLE临时表是会话或事务级别的,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。

 

临时表语法

 

clip_image002

 

 

临时表分类

 

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

1)ON COMMIT DELETE ROWS

它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据

2)ON COMMIT PRESERVE ROWS

它表示临时表的内容可以跨事物而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。

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

会话级别的临时表创建:

复制代码
CREATE GLOBAL TEMPORARY TABLE TMP_TEST

(

    ID NUMBER ,

    NAME VARCHAR2(32)

) ON COMMIT PRESERVE ROWS;

或

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT PRESERVE ROWS

AS

SELECT * FROM TEST;

操作示例:

SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST

 (

   ID NUMBER ,

   NAME VARCHAR2(32)

 ) ON COMMIT PRESERVE ROWS;

Table created

SQL> INSERT INTO TMP_TEST

    SELECT 1, 'kerry' FROM DUAL;

1 row inserted

SQL> COMMIT;

Commit complete

SQL> SELECT * FROM TMP_TEST;

ID         NAME

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

1         kerry

SQL> INSERT INTO TMP_TEST

   SELECT 2, 'rouce' FROM DUAL;

1 row inserted

SQL> ROLLBACK;

Rollback complete

SQL> SELECT * FROM TMP_TEST;

ID           NAME

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

1           kerry

SQL>
复制代码

 

2:事务级的临时表(默认),这种类型的临时表与事务有关,当进行事务提交或者事务回滚的时候,临时表的数据将自行截断,即当COMMIT或ROLLBACK时,数据就会被TRUNCATE掉,其它的特性和会话级的临时表一致。

事务级临时表的创建方法:

复制代码
CREATE GLOBAL TEMPORARY TABLE TMP_TEST

(

    ID NUMBER ,

    NAME VARCHAR2(32)

) ON COMMIT DELETE ROWS;

或

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;

SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
     ID NUMBER ,
     NAME VARCHAR2(32)
 ) ON COMMIT DELETE ROWS;

Table created

SQL> INSERT INTO TMP_TEST

   SELECT 1, 'kerry' FROM DUAL;

1 row inserted

SQL> SELECT * FROM TMP_TEST;

ID           NAME

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

1           kerry

SQL> COMMIT;

Commit complete

SQL> SELECT * FROM TMP_TEST;

ID             NAME

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

SQL>
复制代码

 

3:关于临时表只对当前会话或事务可见。每个会话只能查看和修改自己的数据。

用DM用户登录数据库,打开SESSION 1后,创建临时表TMP_TEST

 

复制代码
CREATE GLOBAL TEMPORARY TABLE TMP_TEST

(

    ID NUMBER ,

    NAME VARCHAR2(32)

) ON COMMIT DELETE ROWS;

或

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;

SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST

 (

     ID NUMBER ,

     NAME VARCHAR2(32)

 ) ON COMMIT DELETE ROWS;

Table created

SQL> INSERT INTO TMP_TEST

   SELECT 1, 'kerry' FROM DUAL;

1 row inserted

SQL> SELECT * FROM TMP_TEST;

ID           NAME

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

1 kerry

SQL> COMMIT;

Commit complete

SQL> SELECT * FROM TMP_TEST;

ID           NAME

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

SQL>
复制代码

 

 

用sys用户登录数据库,打开SESSION 2

SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TMP_TEST' --可以查到临时表数据

SELECT * FROM DM.TMP_TEST; --查不到数据,即使TMP_TEST临时表存在数据。

 

临时表与永久表区别

复制代码
SQL> SELECT TABLE_NAME, TABLESPACE_NAME,"LOGGING",

    "TEMPORARY", DURATION, "MONITORING"

   FROM DBA_TABLES WHERE TABLE_NAME IN ('TMP_TEST', 'TEST') ;

TABLE_NAME   TABLESPACE_NAME LOGGING TEMPORARY DURATION    MONITORING

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

TEST          TBS_EDS_DATA    YES       N                      YES

TMP_TEST                      NO        Y     SYS$SESSION       NO
复制代码

 

如上所示,临时表是存储在临时表空间里面的,但是上面脚本可以看出,临时表在数据字典中没有指定其表空间,临时表是NOLOGGING,DURATION为SYS$SESSION

临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少其实在应用中,往往会创建一个NOLOGGING的永久表(中间表)来保存中间数据,从而代替临时表,至于这这两者有啥优劣,真是很难说清道明(欢迎大家探讨)。

 

临时表用途

 

什么时候使用临时表?用临时表和用中间表有啥区别呢?

我觉得是在需要的时候应用,下面是David Dai关于临时表的一个应用说明,我觉得非常形象的说明了临时表的应用场景:对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。因此,对于这种案例,就可以采用创建临时表(ON COMMIT PRESERVE ROWS)的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML操作的压力。

1:当处理某一批临时数据,需要多次DML操作时(插入、更新等),建议使用临时表。

2:当某些表在查询里面,需要多次用来做连接时。(为了获取目标数据需要关联A、B、C, 同时为了获取另外一个目标数据,需要关联D、B、C....)

关于临时表和中间表(NOLOGGING,保存中间数据,使用完后删除)那个更适合用来存储中间数据,我个人更倾向于使用临时表,而不建议使用中间表。

 

注意事项

1 ) 不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。这点网上很多资料都这么说,我没有追查到底是那个版本不支持lob对象,至少在ORACLE 10g这个版本中,临时表是支持lob对象的.

SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST

2 (

3 ID NUMBER ,

4 NAME CLOB

5 ) ON COMMIT PRESERVE ROWS;

Table created

SQL>

SQL> INSERT INTO TMP_TEST

2 SELECT 1, 'ADF' FROM DUAL;

1 row inserted

SQL> SELECT * FROM V$VERSION;

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE 10.2.0.1.0 Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

2 ) 不支持主外键关系

3 )临时表不能永久的保存数据。

4 )临时表的数据不会备份,恢复,对其的修改也不会有任何日志信息

5 )临时表不会有DML 锁

DML locks are not acquired on the data of the temporary tables. The LOCK statement has no effect on a temporary table, because each session has its own private data.

6 )尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。请见官方文档:

DML statements on temporary tables do not generate redo logs for the data changes.However, undo logs for the data and redo logs for the undo logs are generated. Data from the temporary table is automatically dropped in the case of session termination,either when the user logs off or when the session terminates abnormally such as during a session or instance failure.

7 ) 临时表可以创建临时的索引、视图、触发器。

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

SQL> DROP TABLE TMP_TEST PURGE;

DROP TABLE TMP_TEST PURGE

ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引

SQL> TRUNCATE TABLE TMP_TEST;

Table truncated

SQL> DROP TABLE TMP_TEST PURGE;

Table dropped

分享到:
评论

相关推荐

    Oracle中的临时表讲解

    Oracle中的临时表是一种特殊的数据表,用于存储在特定会话或事务期间产生的临时数据。它们在数据库中存在,但其生命周期受到严格的限制,以确保数据的隔离性和安全性。临时表主要分为两类:事务级别的临时表和会话...

    Oracle用户(user)和表空间(tablespace).pdf

    表空间分为多种类型,包括系统表空间(如 `SYSTEM` 和 `SYSAUX`)、回滚表空间(UNDO)、临时表空间(TEMP)以及用户数据表空间(USERS)。系统表空间存放数据库系统组件,不建议存储用户数据;回滚表空间用于存储...

    oracle表空间命令语句大全

    Oracle 表空间命令语句大全提供了 Oracle 数据库管理的重要操作,包括建立表空间、建立 UNDO 表空间、建立临时表空间、改变表空间状态、删除表空间、扩展表空间和查看表空间信息等。这些命令对于 Oracle 数据库管理...

    oracle定时删除表空间的数据并释放表空间

    同时,为了释放表空间,需要创建一个临时表,复制原表的所有数据到临时表,然后删除原表,最后再将临时表的数据插入到原表。 代码如下: ```sql create or replace procedure del_tab as v_time number; begin ...

    oracle创建表空间

    以下将详细讲解如何在Oracle中创建表空间、临时表空间、用户以及授权,并讨论相关知识点。 1. 创建表空间: 创建表空间的目的是为数据库对象分配存储空间。在创建时,我们需要指定数据文件的位置、初始大小、自动...

    Oracle讲解3表空间.ppt

    4. TEMP:临时表空间,用于存储临时表和临时索引,常用于排序和连接操作。 5. USERS:用户默认的表空间,存放用户创建的对象。 确定表空间结构时,需要考虑以下几个因素: 1. 操作系统目录结构:根据数据库的组织...

    Oracle性能调优讲解

    - **排序和临时表空间**:优化排序操作,减少临时表空间的使用频率。 - **SQL语句优化**:通过对SQL语句进行分析和优化,提升查询效率。 #### 六、总结 Oracle性能调优是一个涉及多个层面、需要综合考虑多方面因素...

    oracle存储过程使用游标对多表操作例子

    给定的存储过程“UpdateTempInventoryM”旨在更新一个名为“tmp_inventorym”的临时表,该表汇总了不同业务操作(如收货、发货、借出等)后的库存状态。过程接收五个参数:`DateMMin`、`HasBlin`、`HasQtyin`、`...

    linux oracle创建用户,表空间 资料

    以下将详细讲解如何在Linux上进行Oracle用户创建和表空间设置。 首先,确保你的Linux系统已经安装了Oracle数据库服务器,并且你有足够的权限进行数据库操作。通常,你需要以`oracle`或`dba`用户身份登录到系统。 1...

    Oracle数据库的实例/表空间/用户/表之间关系简单讲解

    本文将深入讲解Oracle数据库中实例、表空间、用户和表之间的关系。 首先,我们需要理解Oracle数据库的基本结构。一个完整的Oracle数据库由两大部分组成:Oracle数据库本身和数据库实例。数据库是存储在磁盘上的物理...

    oracle 表空间

    3. 临时表空间(Temporary Tablespace):用于临时存储排序和聚合操作的结果。 4. 回滚表空间(Rollback Tablespace):存储事务回滚信息,用于恢复操作。 5. Undo表空间(Undo Tablespace):Oracle 9i之后引入,也...

    Oracle与Access表之间的导入和导出

    在某些场景下,可能需要在 Oracle 和 Access 之间进行数据迁移,比如整合数据、备份或临时数据存储。本文将详细讲解如何在 Oracle 的 FORM 程序中实现这两个系统之间的数据导入和导出。 首先,为了在 Oracle 和 ...

    Oracle 10g应用指导

    主要包括各种类型的表创建以及适用情形,如外部表、分区表、嵌套表、全局临时表等;完整性约束的管理;索引,包括B树索引、基于函数的索引、位图索引、反向索引、降序索引、压缩索引等的使用方法及其适用情形等。在...

    ORACLE数据库教程-SQL使用讲解.ppt

    ### ORACLE数据库教程-SQL使用讲解 #### 一、SQL简介 SQL,全称为Structured Query Language,即结构化查询语言,是由IBM公司在1970年代为其System R项目设计的一种数据库查询语言。自那时起,SQL迅速发展并成为...

    Oracle高级SQL培训与讲解.doc

    这个临时视图被存储在用户的临时表空间中,可以在同一查询中多次调用,无需重复执行相同的子查询,从而显著提高了查询效率。这一特性在处理大型数据集或多步查询时尤为关键,因为减少了数据库服务器的负载,提升了...

    Oracle SQL实用讲解,最基本最实用的相关讲解

    若要强制使用临时表,可以使用HINTS,例如`/*+ materialize */`。 2. **CONNECT BY语句**: 这个语句用于构建层次查询,特别适用于处理具有层级关系的数据,如组织结构或家族树。基本语法如下: ```sql CONNECT ...

    Oracle管理表空间和数据文件.ppt.pptx

    本篇文章将详细讲解如何管理和操作Oracle中的表空间和数据文件。 首先,表空间的创建是数据库初始化的重要步骤。创建表空间的语法包括定义表空间名称、数据文件的位置和大小,以及可选的存储参数。例如,创建名为...

    Oracle创建用户、表空间

    在Oracle中,可以创建永久性表空间和临时表空间。下面将详细介绍这两种类型的表空间创建方法: #### 1. 创建临时表空间 ```sql CREATE TEMPORARY TABLESPACE test_temp TEMPFILE 'E:\oracle\product\10.2.0\oradata...

    Oracle里抽取随机数的多种方法

    注意,dbms_random.value(1,5000) 是取 1 到 5000 间的随机数,会有小数,因此我们需要使用 trunc 函数对随机数字取整,以便和临时表的整数 ID 字段相对应。 如果 tmp_1 记录比较多(10 万条以上),我们也可以找一...

Global site tag (gtag.js) - Google Analytics