内容提要
PostgreSQL没有内置支持全局临时表的功能,但有几个扩展可提供此功能。其中一个扩展是PGTT,允许用户创建类似于Oracle的全局临时表。另一个选择是使用基于SQL的扩展,如pg_global_temp_tables和Global-Temporary-Tables-For-PG。这些扩展提供了在事务之外创建临时表和支持临时表上的索引等功能。然而,它们可能无法解决目录表膨胀的问题。pgtt扩展稳定且功能齐全,但尚未由PostgreSQL全球开发组分发为二进制包。总体而言,在PostgreSQL中实现全局临时表的最佳选择是使用这些扩展或重写应用程序以使用本地临时表。
延伸解读
全局临时表的核心价值与实现难点
全局临时表(GTT)的DDL结构持久,但数据仅对插入会话可见,且不产生WAL日志。这能避免因频繁创建临时表导致的系统目录表膨胀,从而提升所有查询的性能。然而,PostgreSQL核心团队多次尝试实现该功能均未成功,主要因设计复杂且可能引入侵入性改动,因此目前只能依赖扩展。
PGTT扩展:Oracle兼容的首选方案
PGTT扩展提供与Oracle全局临时表相同的语法和行为,支持ON COMMIT DELETE ROWS等选项,便于从Oracle迁移的应用无需重写代码。自4.0版本起,可通过session_preload_libraries自动加载,无需手动LOAD,并支持Windows。但需注意,它仍会动态创建临时表,无法解决目录表膨胀问题。
其他扩展的适用场景与局限
pg_global_temp_tables和Global-Temporary-Tables-For-PG是基于SQL的扩展,后者增加了事务外使用和索引支持,适合DBaaS平台如AWS RDS,但前者自2018年未维护。这些扩展功能有限,且同样无法解决目录表膨胀。若需完整功能,PGTT更稳定,但尚未由PGDG提供二进制包。
迁移与选型建议
对于从Oracle或SQL Server迁移的用户,若需全局临时表,PGTT扩展是最佳选择,因其语法兼容且功能完整。若无法使用扩展(如受限的DBaaS),可考虑SQL实现或重写应用使用本地临时表。但需权衡:本地临时表需在每个会话中重建,可能增加目录表负担。
Q&A
PostgreSQL中如何实现全局临时表?
可以通过PGTT扩展或其他扩展如pg_global_temp_tables和Global-Temporary-Tables-For-PG来实现全局临时表。
PGTT扩展的主要功能是什么?
PGTT扩展允许用户创建类似于Oracle的全局临时表,支持在PostgreSQL中使用。
全局临时表与标准临时表有什么区别?
全局临时表具有持久的DDL结构,但数据不持久,仅对插入数据的会话可见,而标准临时表在会话结束时会被删除。
使用全局临时表有什么好处?
使用全局临时表可以避免目录表膨胀的问题,减少系统目录表的插入和删除操作。
PGTT扩展是否已经被PostgreSQL全球开发组分发?
PGTT扩展尚未由PostgreSQL全球开发组分发为二进制包。
在PostgreSQL中实现全局临时表的最佳选择是什么?
最佳选择是使用PGTT扩展或重写应用程序以使用本地临时表。