plan_filter

使用执行计划代价过滤阻止特定查询语句

概览

扩展包名版本分类许可证语言
pg_plan_filter0.0.1FEATPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2810plan_filter-
相关扩展age hll rum pg_graphql pg_jsonschema jsquery pg_hint_plan hypopg

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.11817161514pg_plan_filter-
RPMPIGSTY0.0.11817161514pg_plan_filter_$v-
DEBPIGSTY0.0.11817161514postgresql-$v-pg-plan-filter-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d12.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d12.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d13.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d13.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1

构建

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

pig build pkg pg_plan_filter         # 构建 RPM / DEB 包

安装

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

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

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

pig install pg_plan_filter;          # 当前活跃 PG 版本安装
pig ext install -y pg_plan_filter -v 18  # PG 18
pig ext install -y pg_plan_filter -v 17  # PG 17
pig ext install -y pg_plan_filter -v 16  # PG 16
pig ext install -y pg_plan_filter -v 15  # PG 15
pig ext install -y pg_plan_filter -v 14  # PG 14
dnf install -y pg_plan_filter_18       # PG 18
dnf install -y pg_plan_filter_17       # PG 17
dnf install -y pg_plan_filter_16       # PG 16
dnf install -y pg_plan_filter_15       # PG 15
dnf install -y pg_plan_filter_14       # PG 14
apt install -y postgresql-18-pg-plan-filter   # PG 18
apt install -y postgresql-17-pg-plan-filter   # PG 17
apt install -y postgresql-16-pg-plan-filter   # PG 16
apt install -y postgresql-15-pg-plan-filter   # PG 15
apt install -y postgresql-14-pg-plan-filter   # PG 14

预加载配置

shared_preload_libraries = 'plan_filter';

用法

plan_filter: 根据执行计划过滤语句

pg_plan_filter 模块在执行前根据配置的条件检查语句,如果违反条件则抛出错误。这允许管理员阻止在生产数据库上执行某些查询。

目前支持的唯一条件是语句计划的最大允许估算成本。

配置

postgresql.conf 中添加:

shared_preload_libraries = 'plan_filter'
plan_filter.statement_cost_limit = 100000.0

statement_cost_limit 必须设置为非零值才能启用过滤。默认值为 0(不过滤)。

GUC 参数

参数类型默认值描述
plan_filter.statement_cost_limitfloat0最大允许估算计划成本。0 表示禁用过滤
plan_filter.limit_select_onlyboolfalse为 true 时仅过滤 SELECT 语句

示例

全局阻止高成本查询:

plan_filter.statement_cost_limit = 100000.0

仅限制 SELECT 语句(注意:SELECT != READONLY,因为 SELECT 也可以修改数据):

plan_filter.limit_select_only = true

当模块以非零 statement_cost_limit 运行时,也会阻止对高成本查询执行 EXPLAIN。临时绕过过滤:

BEGIN;
SET LOCAL plan_filter.statement_cost_limit = 0;
EXPLAIN SELECT ...;
COMMIT;

按用户覆盖限制:

ALTER USER can_run_expensive SET plan_filter.statement_cost_limit = 0;
ALTER USER only_cheap_queries SET plan_filter.statement_cost_limit = 10000;

注意事项

statement_cost_limit 基于估算成本取消计划。PostgreSQL 规划器返回的成本估算可能与实际查询执行时间无关。请准备好应对误报取消的情况,并将限制值设置得宽裕一些。


最后修改 2026-03-14: update extension metadata (953cbd0)