【问题标题】:DECLARE GLOBAL TEMPORARY TABLE Vs CREATE GLOBAL TEMPORARY TABLE in DB2在 DB2 中声明全局临时表与创建全局临时表
【发布时间】:2023-04-08 06:00:01
【问题描述】:

我正在 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. 我在使用 CREATE GLOBAL TEMPORARY TABLE 时找不到 Replace 关键字。

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

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

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

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

【问题讨论】:

    标签: performance stored-procedures db2 temp-tables


    【解决方案1】:

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

    创建的临时表在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)应主要在没有更新临时数据时考虑 是必需的,并且对临时数据的访问完全是顺序的。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-04-25
          • 2016-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-02
          • 2023-03-27
          • 1970-01-01
          相关资源
          最近更新 更多