内容提要
使用SQL DML操作中的临时表有几个好处。Oracle数据库的“全局临时表”在处理复杂连接时解决了性能问题。Google发布了适用于Google CloudSQL和AlloyDB的Postgres产品的扩展“pgtt”。在自管理实例中,“pgtt”非常容易使用。
延伸解读
云环境中使用 pgtt 的变通方案
在 Google CloudSQL 和 AlloyDB 等托管 Postgres 产品中,参数 session_preload_libraries 被锁定,无法直接修改。因此,要使用 pgtt 扩展,必须在每个会话中显式执行 LOAD 'pgtt',或将其嵌入函数/存储过程中。文章示例显示,在函数开头调用 LOAD 是可行的,但会带来轻微性能开销(约 1-4 毫秒)。
未加载 pgtt 库的严重后果
如果忘记加载 pgtt 库,pgtt_schema 下的临时表会表现为普通表,数据不会在事务提交或会话断开时截断。文章演示了重复调用函数导致数据不断累积,最终产生重复行。这可能导致查询结果错误或数据膨胀,因此必须确保有程序化方法可靠地加载扩展。
pgtt 临时表未创建时的错误
如果 pgtt 临时表尚未创建,任何引用它的查询都会失败,并报错“relation does not exist”。文章中的示例显示,在未创建表的情况下调用函数会直接抛出错误。因此,在使用 pgtt 前,必须确保在目标数据库中已创建相应的全局临时表。
Q&A
pgtt扩展的主要功能是什么?
pgtt扩展用于在PostgreSQL中实现全局临时表,解决了原生临时表的持久性和性能问题。
如何在自管理实例中使用pgtt?
在自管理实例中,可以在连接时通过用户加载pgtt扩展,或为数据库设置默认加载。
如果不加载pgtt库会发生什么?
如果不加载pgtt库,临时表将表现为真实表,数据不会被截断,可能导致重复数据。
在云数据库中使用pgtt时需要注意什么?
在云数据库中,某些参数需要锁定,且无法直接操作session_preload_libraries,需通过函数加载pgtt。
pgtt扩展如何解决Postgres目录膨胀问题?
pgtt扩展通过提供持久的全局临时表,避免了每次使用时都需创建临时表,从而减少目录膨胀。
如何恢复为旧式临时表?
要恢复为旧式临时表,必须断开会话并重置用户或数据库的设置。