在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时遇到的问题很少:
使用Replace
时找不到CREATE GLOBAL TEMPORARY TABLE
关键字。
考虑一个场景,
我打开连接并执行存储过程,
在该存储过程中创建全局临时表
并且在该存储过程中调用另一个存储过程
再次有same
创建Temp表语句..在这种情况下会发生什么..
它会抛出任何错误,因为两个表naes是相同的并且在单个连接中?
声明有会话并且创建没有??这与持久性有关吗?
在性能方面哪个更好?声明临时或创建临时?
建议一些方案,以便最好地使用declare / create !!
答案 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)
我们不需要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