pgtt
类似Oracle的全局临时表功能
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pgtt | 4.4 | SIM | ISC | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 9110 | pgtt | 否 | 是 | 是 | 是 | 否 | 否 | pgtt_schema |
| 相关扩展 | oracle_fdw orafce session_variable pg_statement_rollback pg_dbms_metadata pg_dbms_lock pg_dbms_job periods |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 4.4 | 1817161514 | pgtt | - |
| RPM | PGDG | 4.4 | 1817161514 | pgtt_$v | - |
| DEB | PGDG | 4.4 | 1817161514 | postgresql-$v-pgtt | - |
构建
您可以使用 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;
用法
创建全局临时表
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 进行分区