11

我正在 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 站点我得到了一个信息,认为 create 是最好的,因为它是持久的,允许所有用户会话访问相同的表定义,而无需在启动时声明它以及更多优势。

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

我在使用 create over declare 时遇到了一些疑问:

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

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

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

  4. 在性能方面哪个更好?声明温度还是创建温度?

  5. 建议一些场景以最好地使用声明/创建!

4

3 回答 3

9

Craig S. Mullins有一篇很好的文章,涵盖了两者之间的主要区别。对于大多数目的,它们的工作方式相同。

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

CTT 有一些缺点:

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

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

  • 不能在创建的临时表上创建约束。

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

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

  • 不能将创建的临时表指定为 UPDATE 语句的对象。

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

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

DTT 通常更灵活:

  • 声明的临时表可以定义索引和 CHECK 约束。

  • 您可以针对已声明的临时表发出 UPDATE 语句和定位的 DELETE 语句。

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

现在为您编号的问题:

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

3.SESSION只是 DTT 的模式标识符。它表明它是一个不持久的临时表。

4. 我认为两者的性能大致相同。它们将比普通表更快,因为锁定、日志记录、恢复等将不适用。

5. 一般来说,我会说 DTT 是可行的方法,但 CTT 很有用(正如 Craig 在他的文章中所说):

(CTTs) 应该主要在不需要更新临时数据并且访问临时数据是纯顺序的时考虑。

于 2013-03-29T13:57:16.300 回答
1

Craig S. Mullins 的文章适用于 DB2 for 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

于 2019-11-19T11:18:36.697 回答
0
  1. 我们发现 Created Temp Tables - 在我们的例子中 - 表现得比 DTT 好得多。这可能是一个例外(视情况而定),但改变的动力是看到使用 DTT 执行的增量绑定的数量。每个事务需要 23 个临时表。我们进行了并行测试,发现 CTT 导致 cpu 和 In_DB2 时间大幅下降。我们还看到 lock/latch 等待的下降,并发现使用 CTTs 我们的 ZIIP cpu 开始超过我们的 GP cpu,这让每个人都很高兴。

我们不需要 DTT 索引或更新访问,也不需要任何 RI。

于 2015-03-13T20:37:50.690 回答