pgtt

类似Oracle的全局临时表功能

概览

扩展包名版本分类许可证语言
pgtt4.4SIMISCC
ID扩展名BinLibLoadCreateTrustReloc模式
9110pgttpgtt_schema
相关扩展oracle_fdw orafce session_variable pg_statement_rollback pg_dbms_metadata pg_dbms_lock pg_dbms_job periods

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG4.41817161514pgtt-
RPMPGDG4.41817161514pgtt_$v-
DEBPGDG4.41817161514postgresql-$v-pgtt-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 4.4
d12.aarch64
PGDG 4.4
d13.x86_64
PGDG 4.4
PGDG 4.4
PGDG 4.4
PGDG 4.4
PGDG 4.4
d13.aarch64
PGDG 4.4
PGDG 4.4
PGDG 4.4
PGDG 4.4
PGDG 4.4
u22.x86_64
u22.aarch64
PGDG 4.4
u24.x86_64
u24.aarch64
PGDG 4.4

构建

您可以使用 pig build 命令构建 pgtt 扩展的 DEB 包:

pig build pkg pgtt         # 构建 DEB 包

安装

您可以直接安装 pgtt 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgtt;          # 当前活跃 PG 版本安装
pig ext install -y pgtt -v 18  # PG 18
pig ext install -y pgtt -v 17  # PG 17
pig ext install -y pgtt -v 16  # PG 16
pig ext install -y pgtt -v 15  # PG 15
pig ext install -y pgtt -v 14  # PG 14
dnf install -y pgtt_18       # PG 18
dnf install -y pgtt_17       # PG 17
dnf install -y pgtt_16       # PG 16
dnf install -y pgtt_15       # PG 15
dnf install -y pgtt_14       # PG 14
apt install -y postgresql-18-pgtt   # PG 18
apt install -y postgresql-17-pgtt   # PG 17
apt install -y postgresql-16-pgtt   # PG 16
apt install -y postgresql-15-pgtt   # PG 15
apt install -y postgresql-14-pgtt   # PG 14

预加载配置

shared_preload_libraries = 'pgtt';

创建扩展

CREATE EXTENSION pgtt;

用法

pgtt: 为 PostgreSQL 添加全局临时表功能的扩展

创建全局临时表

CREATE EXTENSION pgtt;

-- ON COMMIT PRESERVE ROWS:数据在会话内跨事务保持
CREATE GLOBAL TEMPORARY TABLE test_gtt (
    id integer,
    lbl text
) ON COMMIT PRESERVE ROWS;

-- ON COMMIT DELETE ROWS:数据在事务提交时删除
CREATE GLOBAL TEMPORARY TABLE session_data (
    id integer,
    value text
) ON COMMIT DELETE ROWS;

GLOBAL 关键字也可以作为注释使用以避免警告:

CREATE /*GLOBAL*/ TEMPORARY TABLE test_gtt (
    LIKE other_table INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES
) ON COMMIT PRESERVE ROWS;

CREATE AS 形式

CREATE /*GLOBAL*/ TEMPORARY TABLE gtt_copy
AS SELECT * FROM source_table WITH DATA;

使用全局临时表

INSERT INTO test_gtt VALUES (1, 'one'), (2, 'two');
SELECT * FROM test_gtt;  -- 仅在当前会话中可见

创建索引

CREATE INDEX ON test_gtt (id);

约束

支持除外键以外的所有约束:

CREATE GLOBAL TEMPORARY TABLE t2 (
    c1 serial PRIMARY KEY,
    c2 VARCHAR(50) UNIQUE NOT NULL,
    c3 boolean DEFAULT false
);

删除

DROP TABLE test_gtt;  -- 即使其他会话正在使用也可以删除

配置

SET pgtt.enabled TO off;   -- 禁用 GTT 重路由
SET pgtt.enabled TO on;    -- 重新启用 GTT 重路由

关键行为

  • GTT 内容是会话局部的;其他会话无法看到您的数据
  • 表结构是持久的(对所有用户可见),但数据是按会话的
  • 需要通过 session_preload_libraries = 'pgtt' 加载
  • 不支持对 GTT 进行分区

最后修改 2026-03-14: update extension metadata (953cbd0)