PolarDB PostgreSQL版(兼容Oracle)支持全局临时表特性,同时保留PostgreSQL社区版local temporary table的用法。

语法

CREATE GLOBAL TEMPORARY|TEMP TABLE table-name
    { column-definition [ , column-definition ] * }
[ ON COMMIT {DELETE | PRESERVE} ROWS ]
  • 支持ON COMMIT DELETE ROWS子句,即当前事务提交后清空临时表中的数据。
  • 支持ON COMMIT PRESERVE ROWS子句,即当前事务提交后保留临时表中的数据。
  • 不支持ON COMMIT DROP子句。
  • 如果不指定ON COMMIT子句,则缺省行为和ON COMMIT DELETE ROWS一致。

描述

  • 数据库内所有会话(连接)共享全局临时表的表定义,当一个会话创建了一个全局临时表时,其他会话也能使用。
  • 全局临时表的数据在会话间独立,即会话A写入到全局临时表X中的数据对会话B不可见。
  • 当一个会话退出时,会清空该会话中全局临时表中的数据和底层存储。
  • 支持全局临时表和其他表进行join,也支持在全局临时表上创建索引(当前版本仅支持创建btree索引)和全局临时表上的索引扫描。同时,全局临时表在表上和列上的统计信息也是在会话间独立的,这是为了让全局临时表相关的查询获得更优的查询计划。
  • 全局临时表支持手动进行vacuum 和analyze,用于清理垃圾数据和收集统计信息。

示例

create global temp table gtt1(a int primary key, b text); # 创建全局临时表gtt1,缺省on commit delete rows,即当前事务提交时删除表中所有数据。
create global temporary table gtt2(a int primary key, b text) on commit delete rows; #创建全局临时表gtt2,指定on commit delete rows,即当前事务提交时删除表中所有数据。
create global temp table gtt3(a int primary key, b text) on commit PRESERVE rows;  #创建全局临时表gtt3,指定on commit preserve rows,即当前事务提交时保留表中所有数据。

运维

PolarDB提供了一组函数,用于对全局临时表进行日常的运维工作。

  • polar_gtt_attached_pid用于查看一个全局临时表正在被哪些会话使用。您可以使用该函数结合其他函数进行运维工作。
  • polar_gtt_att_statistic用于查看对应一张全局临时表列上的统计信息。
  • polar_gtt_relstats用于查看对应一张全局临时表的表级统计信息。

这些函数是以插件形式存在的,因此在使用之前,需要创建插件。

create extension polar_gtt;

如果您要删除一个全局临时表,则需要保证除了当前会话,没有别的会话正在使用这张表。

具体操作流程如下:
  1. 使用函数polar_gtt_attached_pid查询对应的全局临时表正在被哪些会话使用。
  2. 使用函数pg_backend_pid() 确定当前会话的pid。
  3. 使用函数pg_terminate_backend(pid) 剔除掉非当前会话。
  4. 使用函数drop table删除这个临时表。