`
yqluo2008
  • 浏览: 33901 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

会话级的临时表和事务级的临时表

阅读更多
文章出处:http://hi.baidu.com/ayenglish/blog/item/228f3480bede28cabd3e1e7c.html


ON COMMIT PRESERVE ROWS and ON COMMIT DELETE ROWS2010-12-28 14:59今天看681的时候,遇到了ON COMMIT PRESERVE ROWS ,不知道是什么意思。百度了一下发现,有一个关于‘ORACLE临时表的应用’的文章对这个介绍的挺清楚地,挪为己用。 ORACLE临时表的应用1、前言
  目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。当然在Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在Oracle中创建“临时表”。
  我对临时表的理解:在Oracle中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了。Oracle的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在 ORACLE系统的临时表空间中(TEMP)。

  2、临时表的创建

  创建Oracle临时表,可以有两种类型的临时表:会话级的临时表和事务级的临时表。
  1)会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION不退出的情况下,临时表中的数据就还存在,而当你退出当前 SESSION的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断(truncate table,即数据清空)了。会话级的临时表创建方法:Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2……) OnCommitPreserveRows;举例create global temporary table Student(Stu_id Number(5),Class_id Number(5),Stu_Name Varchar2(8),Stu_Memo varchar2(200)) onCommitPreserveRows ;
  2)事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出 SESSION的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:Create Global Temporary Table Table_Name(Col1 Type1,Col2 Type2……) OnCommit Delete Rows;举例:create global temporary table Classes(Class_id Number(5),Class_Name Varchar2(8),Class_Memo varchar2(200)) onCommit delete Rows ;
  3)、两种不通类型的临时表的区别:语法上,会话级临时表采用oncommitpreserverows而事务级则采用oncommit delete rows;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是commit、rollback或者是会话结束,临时表中的数据都将被截断。


  3、例子:

  1)、会话级(Session关闭掉之后数据就没有了,当Commit的时候则数据还在,当Rollback的时候则数据也是一样被回滚):

insert into student(stu_id,class_id,stu_name,stu_memo) values(1,1,''张三'',''福建''); insert into student(stu_id,class_id,stu_name,stu_memo) values(2,1,''刘德华'',''福州''); insert into student(stu_id,class_id,stu_name,stu_memo) values(3,2,''S.H.E'',''厦门''); SQL> select *from student ;

STU_ID CLASS_ID STU_NAME STU_MEMO ------ -------- -------- ------------------------1 1 张三 福建2 1 刘德华 福州3 2 S.H.E 厦门 4 2 张惠妹 厦门


SQL> commit; Commit complete SQL> select * from student ;

STU_ID CLASS_ID STU_NAME STU_MEMO ------ -------- -------- --------------------1 1 张三 福建2 1 刘德华 福州3 2 S.H.E 厦门 4 2 张惠妹 厦门


SQL>insert into student(stu_id,class_id,stu_name,stu_memo) values(4,2,''张惠妹'',''厦门''); 1 row inserted SQL> select * from student ;

STU_ID CLASS_ID STU_NAME STU_MEMO ------ -------- -------- ------------------1 1 张三 福建2 1 刘德华 福州3 2 S.H.E 厦门 4 2 张惠妹 厦门 4 2 张惠妹 厦门


SQL> rollback ; Rollback complete SQL> select * from student ;

STU_ID CLASS_ID STU_NAME STU_MEMO ------ -------- -------- -------------------1 1 张三 福建2 1 刘德华 福州3 2 S.H.E 厦门 4 2 张惠妹 厦门 SQL>


  2)、事务级(Commit之后就删除数据):本例子将采用以下的数据:

insert into classes(Class_id,Class_Name,Class_Memo) values(1,''计算机'',''9608''); insert into classes(Class_id,Class_Name,Class_Memo) values(2,''经济信息'',''9602''); insert into classes(Class_id,Class_Name,Class_Memo) values(3,''经济信息'',''9603'');


  在一个SESSION中(比如SQLPLUS登陆)插入上面3条记录,然后再以另外一个SESSION(用SQLPLUS再登陆一次)登陆,当你 select * from classes;的时候,classes表是空的,而你再第一次登陆的SQLPLUS中select的时候可以查询到,这个时候你没有进行commit或者rollback之前你可以对刚才插入的3条记录进行update、delete等操作,当你进行commit或者rollback的时候,这个时候由于你的表是事务级的临时表,那么在插入数据的session也看不到数据了,这个时候数据就已经被截断了。

  运行结果如下:

SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(1,''计算机'',''9608''); 1 row inserted SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(2,''经济信息'',''9602''); 1 row inserted SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(3,''经济信息'',''9603''); 1 row inserted SQL> update classes set class_memo ='''' where class_id=3 ; 1 row updated SQL> select * from classes ;

CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------1 计算机 96082 经济信息 96023 经济信息 SQL> delete from classes where class_id=3 ;1 row deleted SQL> select * from classes ;CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -----------1 计算机 96082 经济信息 9602SQL> commit; Commit completeSQL> select *from classes ; CLASS_ID CLASS_NAME CLASS_MEMO-------- ---------- -------------SQL> 再重复插入一次,然后rollback。SQL> Rollback ;Rollback complete SQL> select * from classes ;CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- ----------- SQL>


  4、临时表的应用
  1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。
  2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

  5、注意事项:
  1)、临时表的索引以及对表的修改、删除等和正常的表是一致的。
  2)、Oracle的临时表是Oracle8i才支持的功能特性,如果你的Oracle版本比较低的话,那么就可能没有办法用到了,如果你的Oracle 版本是8i的话,你还需要把$ORACLE_HOME/admin/${ORACLE_SID}/pfile目录下的init< ORACLE_SID>.ora初始参数配置文件的compatible修改为compatible = "8.1.0",我的服务器上就是这样子配置的。当然也可以修改为compatible = "8.1.6"
  以上是我在对大表进行优化的时候采用的一些手段,效果显著。

分享到:
评论

相关推荐

    oracle临时表(事务级、会话级).docx

    "Oracle 临时表(事务级、会话级)" Oracle 临时表是 Oracle 数据库中的一种特殊类型的表,它可以保存...在 Oracle 中,临时表可以分为事务级和会话级,而在 SQL Server 中,临时表可以分为本地临时表和全局临时表。

    Oracle 临时表用法

    下面通过具体的SQL语句展示会话级临时表和事务级临时表的使用。 ##### 6.1 会话级临时表示例 ```sql CREATE GLOBAL TEMPORARY TABLE emp_temp_preserve ON COMMIT PRESERVE ROWS AS SELECT * FROM emp WHERE 1 = 2...

    Oracle存储过程中使用临时表

    本篇文章将深入探讨如何在Oracle存储过程中使用临时表,包括会话级临时表和事务级临时表。 ### 会话级临时表 会话级临时表(Session-Level Temporary Tables)只在创建它的会话内可见,并且在会话结束时自动删除。...

    oracle,sql临时表.pdf

    Oracle的临时表分为两类:会话级临时表和事务级临时表。会话级临时表的数据在整个会话期间有效,直到用户退出会话;而事务级临时表的数据仅在事务期间存在,事务结束后数据即被清除。临时表的一个关键特性是其数据的...

    Oracle_临时表介绍

    临时表在Oracle中有两种类型:会话级临时表和事务级临时表。 1. **会话级临时表**: 会话级临时表的数据仅对当前会话可见,且在会话结束时,数据会被自动截断,即清空。即使在同一个会话内进行了多次提交(`COMMIT...

    oracle学习笔记整理

    临时表分为两类:会话级临时表和事务级临时表,这两种类型各有其特定的生命周期和数据保留规则。 会话级临时表的数据在创建它的会话期间保持有效,直到会话结束,不论是正常退出还是异常终止,Oracle都会自动清空表...

    SpringBoot 整合Mybatis 创建临时表

    现在,你可以通过调用`createTempTable`和`queryTempTable`方法来完成临时表的创建和查询。这个例子展示了如何在SpringBoot项目中整合Mybatis,创建并使用临时表进行数据操作。这种方式在处理一些临时性、会话级别的...

    oracle 教程 中文教程 数据库 教程

    Oracle 中提供了两种类型的临时表:会话级临时表和事务级临时表。 1. **会话级临时表**:这种类型的临时表中的数据在整个会话期间都保持有效,直到会话结束时数据才会被清除。这意味着只要用户会话不结束,临时表中...

    SQL Server中关于临时表概念及创建和插入数据等问题

    临时表可以分为事务临时表和会话临时表。事务临时表是指数据只有在当前事务内有效,关闭事务后,数据表中的内容将被删除。会话临时表是指数据只在当前会话内有效,关闭当前会话或者进行新的连接之后,数据表中的内容...

    ORACLE中临时表

    Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的数据只在事务提交或回滚前有效。一旦事务结束,所有记录都会被自动删除。这种类型的临时表主要用于短暂的中间计算或存储,以...

    对比Oracle临时表和SQL Server临时表的不同点

    - **生命周期**:Oracle提供了两种类型的临时表,即会话级临时表和事务级临时表。会话级临时表在会话结束时自动清空数据,而事务级临时表则在事务结束(无论是提交或回滚)时清空。 - **数据可见性**:每个会话...

    oracle临时表用法

    Oracle 中的临时表有两种:事务级别的临时表和会话级的临时表。事务级别的临时表在事务结束时自动清空记录,而会话级的临时表在会话结束时自动清空。 临时表的特点 临时表有以下特点: * 临时表可以在多用户并发...

    主流数据库中临时表的使用

    临时表有两种类型:本地临时表和全局临时表。本地临时表的名称以单个数字符号 (#) 打头,仅对当前的用户连接是可见的。当用户从 Microsoft SQL Server 2000 实例断开连接时被删除。全局临时表的名称以数学符号 (##) ...

    简单理解数据库临时表

    - **全局临时表**(Global Temporary Table, GGT):不同于会话级临时表,全局临时表可以在整个数据库实例内共享,并且可以在提交或回滚事务后保留数据,直到下一次插入新数据覆盖为止。 #### 四、临时表的创建与...

    数据库面试题

    Oracle数据库支持两种类型的临时表:会话级临时表和事务级临时表。这两种临时表的主要区别在于它们的数据生命周期: 1. **会话级临时表**(SESSION 级别):这类临时表的数据在整个会话期间都是可用的,直到会话...

    mysql临时表用法分析【查询结果可存在临时表中】

    MySQL临时表是一种在会话范围内创建的特殊类型的表,它仅对当前会话可见,并在会话结束时自动删除。这种技术在处理复杂查询、中间数据处理或报表生成时非常有用,因为它允许用户将查询结果暂存起来,以便进一步处理...

    Oracle中的临时表讲解

    临时表主要分为两类:事务级别的临时表和会话级别的临时表。 1. **事务级别的临时表**: 创建这类临时表的命令格式为 `CREATE GLOBAL TEMPORARY TABLE ... ON COMMIT DELETE ROWS`。这类表在事务结束(通常在提交...

    oracle临时表操作学习资料

    - **创建**:创建事务临时表的命令通常类似于`CREATE GLOBAL TEMPORARY TABLE Temp_user (ID NUMBER(12) PRIMARY KEY, name VARCHAR2(10))`。默认情况下,如果没有明确指定,Oracle将创建的临时表视为事务临时表。...

    Oracle临时表

    根据数据的生命周期,Oracle临时表可以分为两大类:事务临时表和会话临时表。 ##### 1. 事务临时表 - **定义**:事务临时表中的数据仅在当前事务的生命周期内有效。一旦事务结束(通过提交或回滚),表中的所有...

Global site tag (gtag.js) - Google Analytics