collection

在PlPGSQL中使用的内存优化高性能集合数据结构

概览

扩展包名版本分类许可证语言
pgcollection2.0.0TYPEApache-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
3630collection-
相关扩展prefix semver unit pgpdf pglite_fusion md5hash asn1oid roaringbitmap

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.0.01817161514pgcollection-
RPMPIGSTY2.0.01817161514pgcollection_$v-
DEBPIGSTY2.0.01817161514postgresql-$v-collection-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u22.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u22.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u24.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u24.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0

构建

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

pig build pkg pgcollection         # 构建 RPM / DEB 包

安装

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

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

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

pig install pgcollection;          # 当前活跃 PG 版本安装
pig ext install -y pgcollection -v 18  # PG 18
pig ext install -y pgcollection -v 17  # PG 17
pig ext install -y pgcollection -v 16  # PG 16
pig ext install -y pgcollection -v 15  # PG 15
pig ext install -y pgcollection -v 14  # PG 14
dnf install -y pgcollection_18       # PG 18
dnf install -y pgcollection_17       # PG 17
dnf install -y pgcollection_16       # PG 16
dnf install -y pgcollection_15       # PG 15
dnf install -y pgcollection_14       # PG 14
apt install -y postgresql-18-collection   # PG 18
apt install -y postgresql-17-collection   # PG 17
apt install -y postgresql-16-collection   # PG 16
apt install -y postgresql-15-collection   # PG 15
apt install -y postgresql-14-collection   # PG 14

创建扩展

CREATE EXTENSION collection;

用法

collection: 用于 PL/pgSQL 的键值集合数据类型

collection 扩展提供了两种内存优化的集合数据类型,用于 PL/pgSQL 函数中。

CREATE EXTENSION collection;

数据类型

  • collection:文本键的键值对(最长 32,767 字符),按创建顺序存储
  • icollection:64 位整数键的键值对,支持稀疏数组

两种类型都支持类型修饰符来指定元素类型:

DECLARE
    c1  collection('date');
    ic1 icollection('int4');

下标访问

DO $$
DECLARE t_capital collection;
BEGIN
    t_capital['USA'] := 'Washington, D.C.';
    t_capital['Japan'] := 'Tokyo';
    RAISE NOTICE '%', t_capital['USA'];  -- Washington, D.C.
END $$;

核心函数

函数说明
add(coll, key, value)添加元素
count(coll)元素数量
delete(coll, key)删除元素
exist(coll, key)检查键是否存在
find(coll, key)获取值
first(coll)将迭代器移至起始位置
last(coll)将迭代器移至末尾位置
next(coll)迭代器前进
prev(coll)迭代器后退
key(coll)当前键
value(coll)当前值
copy(coll)创建副本
sort(coll)按键排序
keys_to_table(coll)所有键作为集合返回
values_to_table(coll)所有值作为集合返回
to_table(coll)键值对作为表返回

迭代器示例

DO $$
DECLARE t_capital collection;
BEGIN
    t_capital['USA'] := 'Washington, D.C.';
    t_capital['United Kingdom'] := 'London';
    t_capital['Japan'] := 'Tokyo';

    t_capital := first(t_capital);
    WHILE NOT isnull(t_capital) LOOP
        RAISE NOTICE 'Capital of % is %', key(t_capital), value(t_capital);
        t_capital := next(t_capital);
    END LOOP;
END $$;

稀疏数组(icollection)

icollection 支持非连续整数索引,并能区分 NULL 值和未初始化的键:

DECLARE sparse icollection;
BEGIN
    sparse[1] := 'first';
    sparse[1000000] := 'millionth';  -- 间隙不会浪费内存
END;