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
如何处理低于和高于其成本限制的查询。首先,我们创建一个包含数据的表:
1234567create table book( id int primary key);-- CREATE TABLEinsert into book(id) select * from generate_series(1, 10000);-- INSERT 0 10000
接下来,我们可以查看单条记录查询和全表查询的执行计划。
123456789101112explain 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
值,这样一条语句会成功执行,另一条则会失败。
12345678set plan_filter.statement_cost_limit = 50; -- 介于 2.49 和 135.0 之间select * from book where id = 1; id---- 1(1 row)-- 成功
12345select * from book;ERROR: 计划成本超出限制HINT: 您的查询计划显示它可能会消耗过多执行时间。这可能是由于SQL逻辑错误,或者只是一个非常耗资源的查询。请重写查询或增加配置参数"plan_filter.statement_cost_limit"。-- 失败