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;
如果您要删除一个全局临时表,则需要保证除了当前会话,没有别的会话正在使用这张表。
具体操作流程如下:
- 使用函数polar_gtt_attached_pid查询对应的全局临时表正在被哪些会话使用。
- 使用函数pg_backend_pid() 确定当前会话的pid。
- 使用函数pg_terminate_backend(pid) 剔除掉非当前会话。
- 使用函数drop table删除这个临时表。