在针对大数据量的多表级联查询或复杂事务处理的时候,引入Oracle临时表是一种不错的策略。因此,在解决实际需求时经常会遇到需要使用存储过程和临时表相互配合的情况。下面就Oracle如何创建临时表以及注意事项做出总结:

一、创建临时表

Oracle临时表分为回话期和事务期两种类型,他们的创建语法基本一致:

  • 会话期临时表

CREATE GLOBAL TEMPORARY TABLE ON COMMIT PRESERVE ROWS;

  • 事务期临时表

CREATE GLOBAL TEMPORARY TABLE ON COMMIT DELETE ROWS;

二、会话期临时表与事务期临时表的区别

在与事务相关的临时表中,数据只存在于事务期间。而在与会话相关的临时表中,数据只存在于会话期间。临时表中的数据为一个会话所私有。每个会话只能查询与修改属于此会话的数据。对临时表数据进行 DML 操作时无需加锁(Lock)。LOCK 语句对临时表无效,因为每个会话只能操作其私有数据。

针对与会话相关的临时表(session-specific temporary table)执行的 TRUNCATE 语句只会清除(truncate)属于此会话的数据,而不会清除此临时表中属于其他会话的数据。

用户可以使用 CREATE INDEX 语句为临时表(temporary table)创建索引。创建在临时表上的索引也是临时的,索引数据的生存周期与临时表内数据的生存周期相同。

*用户可以创建同时访问永久表(permanent table)与临时表(temporary table)的视图。用户还可以在临时表上创建触发器(trigger)。

临时表(temporary table)使用临时段(temporary segment)存储数据。与永久表(permanent table)不同,Oracle 在创建临时表及临时索引时并不会为其分配段(segment),段是在第一次执行 INSERT(或CREATE TABLE AS SELECT)语句时进行分配。在发生首次 INSERT 之前执行的 SELECT,UPDATE,或 DELETE 语句操作的是一个空表。

当没有会话(session)与临时表(temporary table)绑定(bound)的时候,用户才能够对其执行 DDL 操作(ALTER TABLE,DROP TABLE,CREATE INDEX 等)。对临时表执行 INSERT 语句时,会话将和此临时表绑定。在会话结束时对临时表执行的 TRUNCATE 语句将解除(unbound)会话与此临时表的绑定。对于与事务相关的(transaction-specific)临时表,执行 COMMIT 或 ROLLBACK 将解除会话与此临时表的绑定。

三、我们在什么时候应该选择临时表

临时表最常见的使用场合是在存储过程中。例如保存一些复杂检索的结果以提供给之后使用,从而可以避免反复查询。另一种可能的使用场合是在进行某些大数量的多表查询时,一些查询的结果集数据量较少。我们可以先将这部分数据保存在临时表中,从而降低多表查询的级联数量提高检索速度。这时更适合选择会话级临时表。

临时表本身并不难使用,但是我们时常会在生产中忘记它的存在。就我个人经验来说,在某些特定的需求中,使用临时表确实能够降低查询的复杂度和提高查询速度。

Oracle学习笔记(二)——临时表的更多相关文章

  1. Oracle 学习笔记(二)

    一.索引 表的数据是无序的,所以叫堆表(heap table),意思为随机存储数据.因为数据是随机存储的,所以在查询的时候需要全表扫描.索引就是将无序的数据有序化,这样就可以在查询数据的时候 减少数据 ...

  2. Oracle学习笔记二 初识Oracle(二)

    Windows 中的 Oracle 服务 Oracle 9i的每个实例在Windows中都作为一项服务启动 服务是在 Windows 注册表中注册的可执行进程,由 Windows 操作系统管理 “服务 ...

  3. Oracle 学习笔记二

    一.oracle通用函数vnl(a,b) 用于任何类型,如果a的值不为null返回a的值否则返回b的值 条件判断oracle中可以使用 case 字段 when 条件1 then 表达式1 when ...

  4. oracle学习笔记(二)

    1. Oracle字符串操作 1.1. 字符串类型 1.1.1. CHAR和VARCHAR2类型 CHAR和VARCHAR2类型都是用来表示字符串数据类型,用来在表中存放字符串信息, 比如姓名.职业. ...

  5. Oracle学习笔记二

    多表查询: 笛卡尔积: 实际上是两张表的乘积,但是在实际开发中没有太大意义 格式: select * from 表1,表2 select * from emp; select * from dept; ...

  6. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  7. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  8. Oracle学习笔记—数据字典和常用命令(转载)

    转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...

  9. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  10. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

随机推荐

  1. 案例:使用scan IP无法连接数据库

    环境:Oracle RAC(11.2.0.3) 现象:通过scanIP连接数据库报错ORA-12514: ORA-12514: TNS:listener does not currently know ...

  2. Summary: Deep Copy vs. Shallow Copy vs. Lazy Copy

    Object copy An object copy is an action in computing where a data object has its attributes copied t ...

  3. ftp命令行敲不了

    最先安装了vsftpd,但是命令行敲ftp老是不行 解决方案:ftp命令是ftp客户端,vsftp是ftp服务器,两者不是一个概念.你需要安装ftp客户端 yum install ftp 可以自动安装 ...

  4. sql server2012重复执行创建表视图sql及带行号的视图

    1.可重复操作(创建表,视图)的sql语句判断 IF EXISTS ( SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[re ...

  5. c#获取指定时区的日期

    1.首先将服务器的时间转化为utc时间,然后转换成指定时区的日期 public DateTime GetSpecificZoneNowDate(string zoneName = "Chin ...

  6. ActiveMQ 集群负载平衡

    目前的架构: 负载均衡方案:========================================= 第二种方案呢,假设我们整个应用是个食堂,这个食堂里面有好多饭口,每个饭口有好多大爷大妈( ...

  7. javascript 的 事件类型(事件)

    事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. 事件是文档或者浏览器窗口中发生的,特定的交互瞬间. 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都 ...

  8. jsp/servlet/mysql/linux基本概念和操作

    一.什么是OOP编程? 面向对象,以结果为导向,并封装整个过程,并尽可能地增加代码的复用性和可扩展性...... 二.Junit? JUnit是一个java语言的单元测试框架.Junit测试时程序员测 ...

  9. PHP实现多进程并行操作,可做守护进程(转,备用)

    <?php /** * 入口函数 * 将此文件保存为 ProcessOpera.php * 在terminal中运行 /usr/local/php/bin/php ProcessOpera.ph ...

  10. P3366 【模板】最小生成树(堆优化prim)

    堆优化prim #include<cstdio> #include<cstring> #include<queue> using namespace std; st ...