首页 > DB2 & Sql Server > db2 开发 > db2的临时表和oracle的临时表
2014
09-09

db2的临时表和oracle的临时表

ORACLE里面:
引用别人的结论:临时表比普通表好的重点不在于不产生redo log,而是可以避免在大数据量操作的时候,不用临时表的单个查询会将大量数据直接读进内存,往往造成内存不够用,此时系统会将数据部分存储在磁盘上,这样会不停的在内存和磁盘上进行数据交换,这个操作会极大的影响效率,比单纯的读I/O更加浪费时间。
所以在进行大数据量操作的时候,一般建议用临时表,如果数据量比较小,在保证正确执行计划的前提下临时表的确没什么大作用。
引用EYGLE的观点:临时表在DML操作中可以减少redo的生成,从而在保存中间结果集时可以带来较大的性能提高.

总之一点,Oracle临时表可以说是提高数据库处理性能的好方法,在没有必要存储时,只存储在Oracle临时表空间中。

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

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

在IBM db2 v9.7的相关文档里面提到下面的情况,可以使用CGTT即 Create Global Temporary Table

CGTT 在许多应用下都可以带来收益。我们通过一些示例来了解如何有效利用 CGTT 功能:

  • 在线购物车应用,会话开始时为每个用户的购物车创建一个 CGTT,并在会话结束时销毁它,只要在用户真正购买商品后才会复制到实际的表中。
  • 班级入学,每个学生都有所有的课程安排选择,每个学生都将自己的选择放在 CGTT 中。只有在学生接受选择之后,这些选择才会移动到所有课程选择的实际表中。
  • 公司的福利登记,员工将做出下一财政年度的福利选择(卫生保健、牙齿护理、401k 等)。提交选择之后,它们才从 CGTT 移动到实际表中。

CGTT 比普通表更加易于维护,因为普通表需要重新组织,并且可以减少事务繁多的应用程序的记录竞争问题。由于支持使用索引和日志选项,它的调优任务也比 DGTT 更加简单。

定义,使用
像创建普通表一样创建临时表,然后可以直接在存储过程里面使用该临时表,Oracle中的临时表和其他数据库的临时表是相似的,在每个数据库中创建临时表一次,不必在数据库中的每个存储过程中创建一次。临时表总是存在的,他们作为对象存在于数据字典中,并且总是保持为空,直到有会话在其中放入数据。如果不手动Drop 表,临时表还是在数据字典中存在的。(IBM的db2 v9.7现在也是朝这个方向发展的即CGTT)

CREATE GLOBAL TEMPORARY TABLE “USER”.”TMP_TABLE_NAME” 
(“ID” NUMBER(8,0), 
“NAME” VARCHAR2(10 CHAR)
) on commit delete rows;

对临时表的使用和普通表是一样的,只不过存储数据上面有差异,临时表是不永久存储数据的,只在它自己的SESSION里面存储数据,或者在COMMIT, ROLLBACK, 退出session之前 存储数据。

oracle临时表的数据是保存在临时表空间的,临时表空间的数据会根据你建表时候的命令不同而出现不同的效果。

on commit delete rows:提交删除数据,这个表里面的数据当出现commit动作的时候自动删除
on commit reserve rows:提交保存数据,这个表里面的数据当出现commit动作的时候自动保存,当退出本session的时候(直观点说就是退出sqlplus 或者 plsql)

但是要注意,上面两个说法都是指的一个session,无论你设置那种方法,在另外的session中数据都是不可见的。
如:开了一个a窗口,向临时表里面插入数据,这个时候除了a窗口之外的所有窗口都不会看到临时表里的数据无论你采用什么方式建临时表。

DB2里面:
定义了临时表后,我们可以像使用普通表一样使用临时表。临时表只对定义它的用户有效,不同用户可以在同一时间定义同名的临时表,他们之间互不影响。临时表的生命周期是SESSION,当SESSION关闭时,临时表将自动删除,这也是临时表的模式名只能为SESSION的原因。此外,我们还可以给临时表定义索引。

1. DB2的临时表需要用命令Declare Temporary Table来创建, 并且需要创建在用户临时表空间上;

2. DB2在数据库创建时, 缺省并不创建用户临时表空间, 如果需要使用临时表, 则需要用户在创建临时表之前创建用户临时表空间; create user temp tablespace, here is different with system temp tablespace

3. 临时表的模式为SESSION;

4. 缺省情况下, 在Commit命令执行时, 临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;

5. 运行ROLLBACK命令时, 用户临时表将被删除;

6. 在DB2版本8中, 可以对临时表纪录日志。

DB2 9.7: 已创建的全局临时表

定义,使用
db2 v9.7之前,
通常在存储过程里面,先
DECLARE GLOBAL TEMPORARY TABLE TT_ETL_TEMPSQ1 (ORG_NAM  VARCHAR(40),PROJECT_NAM  VARCHAR(40),YE  DECIMAL(18, 2)) NOT LOGGED WITH REPLACE ;

再像正常表一样去使用它。
和oracle不一样的是它的定义并不保存到数据字典里面??不确定

补充:
DB2的临时表是基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL