首页 > 编程知识 正文

oracle临时表和普通表的区别,创建临时表语句

时间:2023-05-06 14:26:58 阅读:171035 作者:1561

关键字:

基本概念,原理

临时表的特点,什么时候用

在此期间,一家新公司的面试官提出了问题。 临时表的作用是以前我们使用缓存的中间数据时,自己做临时表。 其实,oracle本身在这方面已经做了充分的考虑。 除非有某些高级APP应用,否则考虑自己创建临时表。 我对临时表不太了解,所以回去收集这方面的资料,弥补了这个不足。

1、前言

目前,所有使用Oracle作为数据库支持平台的APP应用都是数据量相对较大的系统,表中的数据量一般都在百万级以上。

当然,在Oracle中创建分区是个不错的选择,但是当ywt发现你的APP应用程序中涉及到多个表时,而且这些表大部分都是相对巨大的,当你涉及到时,其中的一个或几个表当我发现查询获得此结果集的速度非常快时,我会考虑在Oracle中创建一个“临时表”。

我对临时表的理解:用Oracle制作表。 此表不用于其他任何功能。 主要用于自己软件系统特有的功能,但ywt用完后表中的数据就不再使用了。 创建Oracle临时表后,几乎不占用表空间。 如果存储在临时表(包括临时表的索引)中的表为空,则插入到临时表中的数据将存储在Oracle系统的临时表空间(TEMP )中。

2、临时表的建立

创建Oracle临时表。 临时表有以下两种:

会话级的临时表

事务级的临时表

1 )会话级临时表如果ywt的当前会话不终止,因为此临时表中的数据与您的当前会话相关,则临时表中的数据仍然存在,但ywt将终止当前会话当然,如果您在另一个会话中登录,则不会看到插入到另一个会话中的数据,这意味着两个不同的SESSION插入的数据互不相关。 当一个SESSION退出时,临时表中的数据将被截断(truncate table,即数据为空)。 如何创建会话级临时表:

创建全局模板表

e Table_Name

(Col1 Type1,Col2 Type2...) On Commit Preserve Rows

举例:

create global temporary table Student

(Stu_id Number(5),

Class_id  Number(5),

Stu_Name Varchar2(8),

Stu_Memo varchar2(200)) on Commit Preserve Rows ;

2) 事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:

Create Global Temporary Table Table_Name

(Col1 Type1,Col2 Type2...) On Commit Delete Rows

举例:

create global temporary table Classes

(Class_id Number(5),

Class_Name Varchar2(8),

Class_Memo varchar2(200)) on Commit delete Rows ;

3)  两中类型临时表的区别

会话级临时表采用on commit preserve rows;而事务级则采用on commit delete rows;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是commitrollback或者是会话结束,临时表中的数据都将被截断

 

4)什么时候使用临时表

 

1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将rxdxmf进行分拆并且得到比较小的结果集合存放在临时表中

2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

 

 

3例子:略

4.临时表的不足之处

 

    1)不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。

2)不支持主外键关系

 

所以,由于以上原因,我们可以自己创建临时表,以弥补oracle临时表的不足之处

 

上面的都是本人经过测试的,但下面是在网上搜索到的方法,本人具体没有测试过,不过觉得可行性很强,有时间测试下

 

   创建方法:

      1、以常规表的形式创建临时数据表的表结构,但要在每一个表的主键中加入一个 SessionID <NUMBER> 列以区分不同的会话。(可以有lob列和主外键)

2、写一个用户注销触发器,在用户结束会话的时候删除本次会话所插入的所有记录(SessionID等于本次会话ID的记录)。

3、程序写入数据时,要顺便将当前的会话ID(SessionID)写入表中。

4、程序读取数据时,只读取与当前会话ID相同的记录即可。

   功能增强的扩展设计:
  1、可以在数据表上建立一个视图,视图对记录的筛选条件就是当前会话的SessionID。
  2、数据表中的SessionID列可以通过Trigger实现,以实现对应用层的透明性。
  3、高级用户可以访问全局数据,以实现更加复杂的功能。

  扩展临时表的优点:
  1、实现了与Oracle的基于会话的临时表相同的功能。
  2、支持SDO_GEOMETRY等lob数据类型。
  3、支持表间的主外键连接,且主外键连接也是基于会话的。
  4、高级用户可以访问全局数据,以实现更加复杂的功能

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。