创建临时表
CREATE TEMPORARY TABLE
创建数据仅存在于当前会话中的表。临时表数据容始终对其他会话不可见。
默认情况下,所有临时表数据都为事务范围数据,也就是说,当 COMMIT
语句结束当前事务后,这些数据将被丢弃。如果 CREATE TEMPORARY TABLE
包括参数 ON COMMIT PRESERVE ROWS
,表数据会保留下来,直至当前会话结束。
临时表可用于将复杂查询处理分为多步来进行。通常情况下,报告工具会容纳创建报告过程中产生的中间结果 — 例如,工具首先获取一个结果集,然后查询该结果集,等等。
创建临时表后,Vertica 会自动为该表生成默认 投影。有关详细信息,请参阅自动投影。
全局表与本地表
CREATE TEMPORARY TABLE
可分别通过关键字 GLOBAL
和 LOCAL
在两个范围(全局和本地)创建表:
数据保留
您可以指定临时表数据为事务范围还是会话范围数据:
-
[ON COMMIT DELETE ROWS](#on)
(默认):Vertica 会在每个事务结束时自动移除所有表数据。 -
[ON COMMIT PRESERVE ROWS](#on2)
:Vertica 会在当前会话中跨事务保留表数据。Vertica 会在会话结束时自动截断表。
注意
如果使用 ON COMMIT PRESERVE ROWS
创建临时表,则在该表含有数据时无法为其添加投影。您必须先使用
TRUNCATE TABLE
移除该表中的所有数据。
您可以为使用 ON COMMIT DELETE ROWS
创建的临时表(无论其中是否填充了数据)创建投影。但是,CREATE PROJECTION
会结束您可能已添加数据的任何事务,因此投影始终为空。
ON COMMIT DELETE ROWS
默认情况下,Vertica 会在当前事务结束时从临时表(全局或本地)中移除所有数据。
例如:
=> CREATE TEMPORARY TABLE tempDelete (a int, b int);
CREATE TABLE
=> INSERT INTO tempDelete VALUES(1,2);
OUTPUT
--------
1
(1 row)
=> SELECT * FROM tempDelete;
a | b
---+---
1 | 2
(1 row)
=> COMMIT;
COMMIT
=> SELECT * FROM tempDelete;
a | b
---+---
(0 rows)
如果需要,您可以在同一个事务中多次使用
DELETE
,以便反复刷新表数据。
ON COMMIT PRESERVE ROWS
您可以通过为临时表定义 ON COMMIT PRESERVE ROWS
关键字,指定临时表在当前会话中跨事务保留数据。Vertica 仅在当前会话结束时自动移除表中的所有数据。
例如:
=> CREATE TEMPORARY TABLE tempPreserve (a int, b int) ON COMMIT PRESERVE ROWS;
CREATE TABLE
=> INSERT INTO tempPreserve VALUES (1,2);
OUTPUT
--------
1
(1 row)
=> COMMIT;
COMMIT
=> SELECT * FROM tempPreserve;
a | b
---+---
1 | 2
(1 row)
=> INSERT INTO tempPreserve VALUES (3,4);
OUTPUT
--------
1
(1 row)
=> COMMIT;
COMMIT
=> SELECT * FROM tempPreserve;
a | b
---+---
1 | 2
3 | 4
(2 rows)
Eon 限制
以下 Eon 模式限制适用于临时表:
-
无论系统 K-safety 如何,临时表的 K-safety 始终设置为 0。如果
CREATE TEMPORARY TABLE
语句将 k‑num 设置为大于 0,Vertica 会返回警告。 -
如果对当前会话的订阅发生更改,则该会话中的临时表将变得不可访问。会话订阅发生更改的原因包括:
-
某个节点离开了参与节点的列表。
-
新节点出现在了参与节点的列表中。
-
为一个或多个分片更改了活动节点。
-
通过显式调用
DO_TM_TASK('mergeout')
或使用ALTER TABLE...ALTER COLUMN
更改列数据类型,在同一会话中由用户触发的合并操作。注意
后台合并操作对会话订阅没有影响。
-