provsql

PostgreSQL 半环溯源、概率与不确定性管理扩展

概览

扩展包名版本分类许可证语言
provsql1.12.0FEATMITC++
ID扩展名BinLibLoadCreateTrustReloc模式
2900provsql-

Requires uuid-ossp and shared_preload_libraries=provsql; the control file marks the extension trusted and non-relocatable.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.12.01817161514provsqluuid-ossp
RPMPIGSTY1.12.01817161514provsql_$v-
DEBPIGSTY1.12.01817161514postgresql-$v-provsql-
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 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
u22.x86_64
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
u22.aarch64
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
u24.x86_64
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
u24.aarch64
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
PIGSTY 1.12.0
u26.x86_64
u26.aarch64

构建

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

BASH
pig build pkg provsql         # 构建 RPM / DEB 包

安装

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

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

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

安装
BASH
pig install provsql;          # 当前活跃 PG 版本安装
pig
BASH
pig ext install -y provsql -v 18  # PG 18
pig ext install -y provsql -v 17  # PG 17
pig ext install -y provsql -v 16  # PG 16
pig ext install -y provsql -v 15  # PG 15
pig ext install -y provsql -v 14  # PG 14
dnf
BASH
dnf install -y provsql_18       # PG 18
dnf install -y provsql_17       # PG 17
dnf install -y provsql_16       # PG 16
dnf install -y provsql_15       # PG 15
dnf install -y provsql_14       # PG 14
apt
BASH
apt install -y postgresql-18-provsql   # PG 18
apt install -y postgresql-17-provsql   # PG 17
apt install -y postgresql-16-provsql   # PG 16
apt install -y postgresql-15-provsql   # PG 15
apt install -y postgresql-14-provsql   # PG 14

预加载配置

BASH
shared_preload_libraries = 'provsql';

创建扩展

SQL
CREATE EXTENSION provsql CASCADE;  -- 依赖: uuid-ossp

用法

来源:

provsql 为 PostgreSQL 添加半环溯源与不确定性管理功能。上游文档涵盖溯源追踪、半环求值、概率、Shapley 和 Banzhaf 值、位置溯源、更新溯源以及时态功能。

加载并追踪溯源

INI
shared_preload_libraries = 'provsql'
SQL
CREATE EXTENSION provsql CASCADE;

如果需要,CASCADE 形式会自动安装 uuid-ossp。入门指南指出,预加载步骤是强制要求,因为 ProvSQL 会安装规划器钩子。

SQL
SELECT provsql.add_provenance('mytable');

SELECT name, provenance()
FROM mytable;

SELECT provsql.remove_provenance('mytable');

用户文档还介绍了溯源映射:

SQL
SELECT create_provenance_mapping('my_mapping', 'mytable', 'column_name');
SELECT create_provenance_mapping_view('my_mapping_view', 'mytable', 'column_name');

概率与影响力

为元组令牌分配概率:

SQL
SELECT set_prob(provenance(), 0.8)
FROM mytable
WHERE id = 1;

SELECT name, probability_evaluate(provenance()) AS prob
FROM mytable;

计算影响力得分:

SQL
SELECT shapley(provenance(), m.token)
FROM mytable, my_mapping AS m;

SELECT banzhaf(provenance(), m.token)
FROM mytable, my_mapping AS m;

文档还介绍了 shapley_all_varsbanzhaf_all_vars,用于一次计算所有输入变量的得分。

内置半环

内置半环函数使用溯源令牌和溯源映射表:

SQL
SELECT name, sr_boolean(provenance(), 'my_mapping')
FROM mytable;

SELECT name, sr_formula(provenance(), 'my_mapping')
FROM mytable;

SELECT name, sr_how(provenance(), 'my_mapping')
FROM mytable;

当前文档包含 sr_howsr_whichsr_tropicalsr_viterbisr_lukasiewiczsr_minmaxsr_maxmin 的编译式包装器。对于 PostgreSQL 14 及更高版本,还包含在多范围值上运行的 sr_temporalsr_interval_numsr_interval_int

SQL
SELECT city,
       sr_minmax(provenance(), 'personnel_level',
                 'unclassified'::classification_level) AS clearance
FROM (SELECT DISTINCT city FROM personnel) AS t;

SELECT entity_id, sr_temporal(provenance(), 'validity_mapping')
FROM mytable;

高级用户仍可定义自定义半环,并通过 provenance_evaluateaggregation_evaluate 对其求值;如果已有编译半环与所需代数相符,上游建议优先使用该编译半环。

额外模式与辅助工具

上游记录的会话 GUC 包括:

SQL
SET provsql.active = on;
SET provsql.where_provenance = on;
SET provsql.update_provenance = on;
SET provsql.tool_search_path = '/opt/d4:/home/postgres/bin';
SET provsql.aggtoken_text_as_uuid = on;

-- After probability_evaluate(...), inspect the route that actually ran:
SHOW provsql.last_eval_method;

provsql.tool_search_path 用于 d4c2ddsharpminic2dweightmcgraph-easy 等外部概率及可视化工具。provsql.last_eval_method 保存最近一次选用的概率求值方法。provsql.aggtoken_text_as_uuid 会让聚合令牌单元格显示为对应的溯源 UUID;agg_token_value_text(token) 可以恢复这些聚合令牌的显示文本。

用户指南还分别介绍了位置溯源辅助工具、更新溯源、get_valid_timetimetraveltimeslicehistoryundo 等时态辅助工具、电路检查工具 circuit_subgraph(root, max_depth)resolve_input(uuid),以及用于准备辅助搜索路径的 setup_search_path()

当前概率与推理接口

近期发行版实质性扩展了 SQL 覆盖范围和概率求值能力:

  • FROM 之外的子查询,包括 EXISTSNOT EXISTSINNOT INANYALL、行值 IN、标量子查询以及 ARRAY(SELECT ...)
  • LEFTRIGHTFULL 外连接,以及修正后的 EXCEPTEXCEPT ALL 溯源;
  • 聚合中遵循 SQL 语义的 NULL 处理,以及 COUNTSUMMINMAXAVG 的精确 HAVING 聚合概率;
  • 通过方法目录和成本选择器选取概率方法,支持 karp-lubystopping-rulesieved-treeprobability_bounds
  • 精确的有界树宽递归可达性、不安全 UCQ 的联合宽度编译、安全 UCQ 的 Möbius 反演,以及循环递归的吸收式溯源;
  • 通过 target | evidence 操作符和整元组 given()/前缀形式实现条件事件与分布;
  • 连续和离散的 random_variable 家族,包括正态、伽马、对数正态、贝塔、威布尔、帕累托、逆伽马、逆高斯、逻辑斯蒂、泊松、二项、几何、超几何和负二项分布;
  • 分布参数本身也是随机变量的分层贝叶斯模型,并在存在闭式解时执行共轭后验更新;
  • 随源数据变化仍保持正确的维护式溯源映射,以及 NOT INEXCEPT 和可空随机变量中符合 SQL 规范的 NULL 行为。

例如,可以基于已观察证据对连续值进行条件化,并读取后验期望:

SQL
WITH model AS (
  SELECT normal(20, 5) AS reading
)
SELECT expected(reading | (reading > 25))
FROM model;

agg_token 类型支持概率聚合表达式所需的算术运算、一元负号和比较操作。请参考官方概率与连续分布章节,在精确求值、编译式求值和基于采样的求值方法之间进行选择。

注意事项

  • 版本 1.11.1 修正了聚合比较的溯源,并使空的 summinmax 和 product 分组返回 SQL NULL。它还改变了为 count(*) 生成的内容寻址令牌;如果旧的空输入行为很重要,请重新运行曾将这些令牌物化的查询。
  • 版本 1.12.0 将 Möbius 求值扩展至自连接,允许 sr_formula 使用可选映射呈现所有门类型,并通过 provsql.last_eval_method 报告 sq-rewritebounded-jwreachability。它还修复了 DML 重写场景,并使重复调用 remove_provenance() 变得安全。
  • ALTER EXTENSION provsql UPDATE 会安装 SQL 变更。由于 ProvSQL 会按会话缓存函数 OID,请重新连接在更新期间一直保持打开的会话。
  • 1.12.0 控制文件设置 default_version = '1.12.0',要求 uuid-ossp,将扩展标记为受信任且不可重定位。
  • 上游文档称 ProvSQL 已在 PostgreSQL 10 到 18 上通过测试。
  • provsql.update_provenance 和多范围半环要求 PostgreSQL 14 或更高版本。
  • 更新溯源追踪仍处于实验阶段;在大范围启用前,请验证其存储与性能开销。