KingbaseESV8R6临时表和全局临时表
临时表概述
临时表用于存放只存在于事务或会话期间的数据。临时表中的数据对会话是私有的,每个会话只能看到和修改自己会话的数据。
您可以创建全局(global)临时表或本地(locall)临时表。 下表列举了它们之间的区别:
全局 | 本地 | |
---|---|---|
定义 | CREATE GLOBAL TEMPORARY TABLE | CREATE LOCAL TEMPORARY TABLE |
存储 | 表定义是持久的,表数据是临时的 | 表定义和表数据都是临时的,在会话退出后被删除 |
所属模式 | 创建在用户指定模式下 | 在临时模式下,用户不可以指定 |
约束限制 | 不支持外键引约用束 | 支持外键引用约束 |
ON COMMIT类型 | 事务级(DELETE ROWS)和会话级(PRESERVE ROWS) | 事务级(DELETE ROWS)会话级(PRESERVE ROWS)和事务结束后删除(DROP) |
临时表的用途
临时表对于必须临时缓存结果集的应用程序很有用。例如,每个员工创建本地临时表,插入本季度的所有订单销售记录,进行统计分析,计算分析后再数据填入普通表中。在会话操作期间,临时表的数据是私有的,各个会话之间数据彼此不影响。表中的数据都可以在事务结束之后删除,或者连接退出之后删除。数据都存在在临时表空间中,临时表都不记录日志。
临时表的创建
创建临时表使用CREATE TEMPORARY/TEMP TABLE语句。将 GLOBAL 或 LOCAL 写在 TEMPORARY 或 TEMP 的前面,指定全局临时表或本地临时表。创建临时表时若不指定GLOBAL 或LOCAL,则默认值为LOCAL。
临时表在一个事务块结束时的行为由 ON COMMIT 控制。三种选项是:
-
PRESERVE ROWS
在事务结束时不采取特殊的动作,是本地临时表采用的默认行为。
-
DELETE ROWS
在每一个事务块结束时将删除临时表中的所有行。实质上,在每一次提交时会完成一次自动的清理。在分区表上使用时,不会将其级联到其分区。这是全局临时表的默认行为。
-
DROP
在当前事务块结束时将删除临时表。在分区表上使用时,此操作将删除其分区,在具有继承子级的表上使用时,将删除依赖子级。仅本地临时表支持在当前事务块结束时将删除临时表。全局临时表不支持ON COMMIT DROP 选项。
临时表可以创建索引,这些索引也是临时的。临时表上的索引使用temp_tablespaces参数指定位置。
最后需要说明,临时表上也存在age年龄的,而且这个年龄会正常增长,有一次,监控数据库查看临时表年龄超过了20亿,然而这并没有给数据库带来事务回卷风险。因为vacuum进程不会对临时表进行freeze操作,vacuum是消耗I\O资源的动作,而临时表数据都是临时的,也就没必要对其进行vacuum,浪费系统资源。