数据库

pg_plan_filter: 限制总成本


pg_plan_filter 是一个Postgres扩展,用于阻止执行那些查询规划器估计总成本超过阈值的语句。该扩展旨在为数据库管理员提供一种限制单个查询对数据库负载影响的方法。

启用扩展

该扩展已通过shared_preload_libraries设置默认启用。

您可以按照以下说明操作。

API接口

plan_filter.statement_cost_limit: 限制执行语句的最大总成本 plan_filter.limit_select_only: 仅限制select语句

请注意,limit_select_only = true并不等同于只读模式,因为select语句仍可能通过函数调用等方式修改数据。

示例

为了演示总成本过滤功能,我们将比较 plan_filter.statement_cost_limit 如何处理低于和高于其成本限制的查询。首先,我们创建一个包含数据的表:

1
2
3
4
5
6
7
create table book( id int primary key);-- CREATE TABLEinsert into book(id) select * from generate_series(1, 10000);-- INSERT 0 10000

接下来,我们可以查看单条记录查询和全表查询的执行计划。

1
2
3
4
5
6
7
8
9
10
11
12
explain select * from book where id =1; QUERY PLAN--------------------------------------------------------------------------- Index Only Scan using book_pkey on book (cost=0.28..2.49 rows=1 width=4) Index Cond: (id = 1)(2 rows)explain select * from book; QUERY PLAN--------------------------------------------------------- Seq Scan on book (cost=0.00..135.00 rows=10000 width=4)(1 row)

现在我们可以选择一个介于单条查询总成本(2.49)和全表查询总成本(135.0)之间的 statement_cost_filter 值,这样一条语句会成功执行,另一条则会失败。

1
2
3
4
5
6
7
8
set plan_filter.statement_cost_limit = 50; -- 介于 2.49 和 135.0 之间select * from book where id = 1; id---- 1(1 row)-- 成功
1
2
3
4
5
select * from book;ERROR: 计划成本超出限制HINT: 您的查询计划显示它可能会消耗过多执行时间。这可能是由于SQL逻辑错误,或者只是一个非常耗资源的查询。请重写查询或增加配置参数"plan_filter.statement_cost_limit"-- 失败

相关资源