pg_sql_ccl 插件说明
更新时间:2025-10-11
1 简介
pg_sql_ccl插件可以限制同类sql的并发度,以保障实例的稳定运行
同类sql是指queryid相同的sql
2 queryid
queryid是PG将sql语句规范化后计算出来的64位整数,下面介绍两种方法来获取sql语句对应的queryid:
- pg_stat_statements
先实际执行下sql,然后通过pg_stat_statements视图来获取queryid,如下:
Plain Text
1begin;
2# 执行sql
3rollback;
4
5create extension if not exists pg_stat_statements;
6select queryid, query from pg_stat_statements where ...;
- explain verbose
PG14及以上版本,explain verbose也会显示queryid,如下:
Plain Text
1postgres=# explain verbose select pg_sleep(1);
2 QUERY PLAN
3-------------------------------------------
4 Result (cost=0.00..0.01 rows=1 width=4)
5 Output: pg_sleep('1'::double precision)
6 Query Identifier: 5457019535816659310
7(3 rows)
基于此,可以封装一个plpgsql函数,如下:
Plain Text
1CREATE FUNCTION get_queryid(query text)
2RETURNS bigint AS $$
3DECLARE
4 json_plan json;
5BEGIN
6 EXECUTE format('EXPLAIN (FORMAT json, VERBOSE) %s', query) INTO STRICT json_plan;
7
8 RETURN json_plan->0->'Query Identifier';
9END;
10$$ LANGUAGE plpgsql;
3 安装
前提条件:
- PG14及以上版本
- compute_query_id参数设置为auto或on
- 需将pg_sql_ccl添加到shared_preload_libraries参数中
安装插件:
Plain Text
1create extension pg_sql_ccl;
卸载插件:
Plain Text
1drop extension pg_sql_ccl;
pg_sql_ccl插件工作在database级别,每个database均需单独创建插件 插件参数:
参数名 | 参数类型 | 取值范围 | 默认值 | 说明 |
---|---|---|---|---|
pg_sql_ccl.max | int | [100, INT_MAX / 2] | 5000 | 最大能加载至内存中的规则条数(修改需重启) |
4 插入规则
使用sql_ccl.insert_rule函数插入一条规则,相关参数如下:
参数名 | 参数类型 | 说明 |
---|---|---|
queryid | bigint | sql对应的queryid |
query | text | sql语句 |
node_tag | int | 在哪些节点上生效: 1:仅在主节点生效 2:仅在备节点生效 3:全部生效 |
max_concurrency | int | 允许的最大并发数 |
enabled | boolean | 该规则是否生效 |
comment | text | 自定义的一些注释 |
返回值:queryid
用户需自行保证queryid与query匹配 规则仅对当前database有效 只能在主节点执行
5 删除规则
使用sql_ccl.delete_rule函数删除一条规则,相关参数如下:
参数名 | 参数类型 | 说明 |
---|---|---|
queryid | bigint | 被删除规则对应的queryid |
返回值:queryid
只能在主节点执行
6 更新规则
使用sql_ccl.update_rule函数更新一条规则,相关参数如下:
参数名 | 参数类型 | 说明 |
---|---|---|
queryid | bigint | 被更新规则对应的queryid |
node_tag | int | 新的node_tag |
max_concurrency | int | 新的max_concurrency |
enabled | boolean | 新的enabled |
返回值:queryid
只能在主节点执行
7 加载规则
使用sql_ccl.load函数将规则加载到内存中,实例重启后需自行加载规则,相关参数如下:
参数名 | 参数类型 | 说明 |
---|---|---|
queryid | bigint | 0:加载当前database下所有enabled的规则 非0:加载当前database下指定queryid的规则 |
返回值:加载规则的条数
备节点上也需要通过sql_ccl.load函数将规则加载至内存
8 卸载规则
使用sql_ccl.unload函数将规则从内存中卸载,相关参数如下:
参数名 | 参数类型 | 说明 |
---|---|---|
dbid | oid | 0:卸载所有database下的规则 非0:卸载指定database下的规则 |
queryid | bigint | 0:卸载所有queryid 非0:卸载指定queryid |
返回值:卸载规则的条数
9 查询规则
查询当前database下持久化的规则(字段信息同插入规则时的参数):
Plain Text
1select * from sql_ccl.rules;
查询当前database下已加载至内存中的规则:
Plain Text
1select * from sql_ccl.stat;
查询所有database下已加载至内存中的规则:
Plain Text
1select * from sql_ccl.global_stat;
相关字段说明:
字段名 | 字段类型 | 说明 |
---|---|---|
cur_concurrency | int | 该规则对应queryid的当前并发数 |
hit_count | bigint | 该规则的命中次数 |
reject_count | bigint | 该规则拒绝执行sql的次数 |