早在 PostgreSQL 9.5 中,发行说明 中有一个简单的条目:提高 PL/pgSQL 数组性能 (Tom Lane)
这背后是一个称为扩展对象的概念。这引入了数据类型在内存中和磁盘上具有不同表示的能力。在大多数情况下,具有相同的表示是理想的。例如,4 字节整数对于磁盘上的长期存储而言紧凑且高效,并且在内存中使用也很简单。但是,对于数组或 JSON 等更复杂的数据类型,它们在内存中(例如 PL/pgSQL 函数)的使用方式与长期存储的需求非常不同。数组和 JSON 等扩展对象从磁盘上使用的平面表示过渡到内存中的扩展表示。
虽然扩展对象已在核心中存在很长时间,但添加新数据类型的扩展很少使用这个概念。我们可以根据PostgreSQL 18 中可用的最新提交来猜测这一点。在此提交之前,如果 PL/pgSQL 函数中使用扩展对象的局部变量是从另一个局部变量赋值的,则这些值将被展平、赋值,然后再次扩展。这种切换最终可能会非常昂贵。此提交极大地帮助了 pgcollection等数据类型。pgcollection 中有一个 COPY 函数可以绕过这种上下文切换,但是当开发人员对任何其他变量使用常规赋值运算符时,他们并不会自然而然地学会使用它。
Pgcollection专为内存使用而设计,旨在帮助人们从 Oracle 等具有关联数组概念的数据库迁移到 PostgreSQL。对于某些人来说,关联数组在其存储过程中被广泛使用,因此将其迁移到 PostgreSQL 可能会很困难。对于以整数索引的关联数组,在 PL/pgSQL 中将其迁移到 PostgreSQL 数组效果很好,但当它们以字符串索引时,通常需要使用 JSON 或 Hstore 等低效的变通方法。由于 Oracle 中的关联数组通常不持久化,因此使用扩展对象作为 pgcollection 是完美的选择。
原文地址:https://mlodgenski.blogspot.com/2025/04/improvements-in-expanded-objects-in.html
原文作者:Jim Mlodgenski




