创建临时表

CREATE TEMPORARY TABLE 创建数据仅存在于当前会话中的表。临时表数据容始终对其他会话不可见。

默认情况下,所有临时表数据都为事务范围数据,也就是说,当 COMMIT 语句结束当前事务后,这些数据将被丢弃。如果 CREATE TEMPORARY TABLE 包括参数 ON COMMIT PRESERVE ROWS,表数据会保留下来,直至当前会话结束。

临时表可用于将复杂查询处理分为多步来进行。通常情况下,报告工具会容纳创建报告过程中产生的中间结果 — 例如,工具首先获取一个结果集,然后查询该结果集,等等。

创建临时表后,Vertica 会自动为该表生成默认 投影。有关详细信息,请参阅自动投影

全局表与本地表

CREATE TEMPORARY TABLE 可分别通过关键字 GLOBALLOCAL 在两个范围(全局和本地)创建表:

数据保留

您可以指定临时表数据为事务范围还是会话范围数据:

  • [ON COMMIT DELETE ROWS](#on)(默认):Vertica 会在每个事务结束时自动移除所有表数据。

  • [ON COMMIT PRESERVE ROWS](#on2):Vertica 会在当前会话中跨事务保留表数据。Vertica 会在会话结束时自动截断表。

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 更改列数据类型,在同一会话中由用户触发的合并操作。