collection
在PlPGSQL中使用的内存优化高性能集合数据结构
仓库
aws/pgcollection
https://github.com/aws/pgcollection
源码
pgcollection-2.0.0.tar.gz
pgcollection-2.0.0.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pgcollection | 2.0.0 | TYPE | Apache-2.0 | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3630 | collection | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 相关扩展 | prefix semver unit pgpdf pglite_fusion md5hash asn1oid roaringbitmap |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 2.0.0 | 1817161514 | pgcollection | - |
| RPM | PIGSTY | 2.0.0 | 1817161514 | pgcollection_$v | - |
| DEB | PIGSTY | 2.0.0 | 1817161514 | postgresql-$v-collection | - |
构建
您可以使用 pig build 命令构建 pgcollection 扩展的 RPM / DEB 包:
pig build pkg pgcollection # 构建 RPM / DEB 包
安装
您可以直接安装 pgcollection 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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 函数中。
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;