DECLARE GLOBAL TEMPORARY TABLE Vs在DB2中创建GLOBAL TEMPORARY TABLE

时间:2013-03-29 06:52:50

标签: performance stored-procedures db2 temp-tables

在DB2中创建GLOBAL TEMPORARY TABLE。当我冲浪时,我有两种方式来创造 1.宣布 2.创建。

1. DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_EMP
      (EMPNO  CHAR(6) NOT NULL,
       SALARY DECIMAL(9, 2),
       BONUS  DECIMAL(9, 2),
       COMM   DECIMAL(9, 2)) WITH REPLACE ON COMMIT PRESERVE ROWS ;

2. CREATE GLOBAL TEMPORARY TABLE TMPDEPT
      (TMPDEPTNO   CHAR(3)      NOT NULL,
       TMPDEPTNAME VARCHAR(36)  NOT NULL,
       TMPMGRNO    CHAR(6),
       TMPLOCATION CHAR(16) ) ON COMMIT PRESERVE ROWS ;

从IBM站点获得了一个信息,创建是最好的,因为它是持久的,允许所有用户会话访问相同的表定义,而不必在启动时声明它和更多的优点。

链接:http://www.ibm.com/developerworks/data/library/techarticle/dm-0912globaltemptable/

我在使用create over declare时遇到的问题很少:

  1. 使用Replace时找不到CREATE GLOBAL TEMPORARY TABLE关键字。

  2. 考虑一个场景, 我打开连接并执行存储过程,
    在该存储过程中创建全局临时表 并且在该存储过程中调用另一个存储过程 再次有same创建Temp表语句..在这种情况下会发生什么.. 它会抛出任何错误,因为两个表naes是相同的并且在单个连接中?

  3. 声明有会话并且创建没有??这与持久性有关吗?

  4. 在性能方面哪个更好?声明临时或创建临时?

  5. 建议一些方案,以便最好地使用declare / create !!

3 个答案:

答案 0 :(得分:9)

有一个good article from Craig S. Mullins涵盖了两者之间的主要差异。在大多数情况下,它们的工作方式相同。

创建临时表是在DSNDB07中创建的,SESSION是工作文件数据库(在需要工作存储的SQL语句中使用的存储区域相同)。声明的临时表存储在您必须创建的临时表空间中。

CTT有一些缺点:

  
      
  • 因为它们不是持久的,所以是一些典型的数据库操作   包括锁定,日志记录和恢复不适用于创建   临时表。

  •   
  • 无法在创建的临时表上创建索引,因此无法访问所有索引   通过完整的表格扫描。

  •   
  • 无法在创建的临时表上创建约束。

  •   
  • null是创建的列允许的唯一默认值   临时表。

  •   
  • DB2实用程序无法引用创建的临时表。

  •   
  • 创建的临时表不能指定为对象   更新声明。

  •   
  • 从创建的临时表中删除时,所有行都必须是   删除。

  •   
  • 虽然可以在创建的临时表上创建视图,但WITH   无法指定CHECK OPTION。

  •   

DTT通常更加灵活:

  
      
  • 声明的临时表可以有索引和CHECK约束   在他们身上定义。

  •   
  • 您可以发出UPDATE语句并定位DELETE语句   对宣布的临时表格。

  •   
  • 您可以隐式定义声明的临时表的列   并使用SELECT中的结果表。

  •   

现在为您编号:

1。 &安培;没有一个。我相信(而且我不确定这是否准确,我们的商店     在所有情况下几乎都使用DTT)CTT被声明一次(通过     一个DBA),然后应用程序员可以在任何会话中使用它。     每个连接都有自己的副本,一旦应用程序断开连接,     该会话中存储在该CTT中的数据将消失。

3。 {{1}}只是DTT的模式标识符。它表明这是一个暂时的     表格不存在。

4。我认为两者都会有相同的表现。他们会更快     比普通表,因为锁定,日志记录,恢复等不适用。

5。总的来说,我会说DTT是要走的路,但CTT是     有用(正如克雷格在他的文章中所说):

  在没有更新临时数据时,应主要考虑(CTTs)   需要,对临时数据的访问纯粹是顺序的。

答案 1 :(得分:0)

  1. 我们发现Created Temp Tables在我们的例子中表现远远好于DTT。它可能是一个例外(取决于),但改变的动力是看到使用DTT执行的增量绑定的数量。每个事务需要23个临时表。我们进行了并行测试,发现CTT导致cpu和In_DB2时间都出现大幅下降。我们还看到了锁定/锁定等待的下降,并发现使用CTT我们的ZIIP cpu开始超过我们的GP cpu,这让每个人都开心。
  2. 我们不需要DTT索引或更新访问权限,也没有使用任何RI。

答案 2 :(得分:0)

Craig S. Mullins的文章适用于DB2 OS / 390平台。 在DB2 9.7中,您实际上可以为DGTT和CGTT创建索引。您也可以启用CGTT登录。 对于9.7,请点击此处:https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.7.0/com.ibm.db2.luw.admin.dbobj.doc/doc/r0054491.html