更新时间:2025-05-29 GMT+08:00

SQL限流函数

gs_add_workload_rule(rule_type, rule_name, databases, start_time, end_time, max_workload, option_val)

描述:创建一条SQL限流规则。需要具有sysadmin权限的用户才可执行。

参数:参数介绍请参见表1

返回值类型:int8

表1 gs_add_workload_rule参数说明

参数名称

类型

描述

取值范围

rule_type

text

限流规则类型,不区分大小写。

“sqlid”:根据Unique SQL ID进行限流。

“select”、“insert”、“update”、“delete”、“merge”:根据查询类型和关键字进行限流。

“resource”:根据系统资源利用率进行实例级别的限流。

rule_name

name

限流规则名称,用于检索限流规则。

任意字符串,可以为NULL。

databases

name[]

限流规则生效的数据库名称数组,区分大小写。

数据库名列表,必须为已创建的数据库名。可以为NULL,表示所有数据库生效。

目前只有指定rule_type为查询类型时,数据库列表才生效,因为Unique SQL ID本身是与库进行绑定的,其只属于某个库;而根据资源利用率的限流规则是对实例生效的,即对所有库生效。

start_time

timestamptz

限流规则生效的开始时间。

可以为NULL,表示从当前时间开始生效。

end_time

timestamptz

限流规则生效的结束时间。

可以为NULL,表示规则一直生效。

max_workload

int8

限流规则设置的最大并发数。

-

option_val

text[]

限流规则的补充信息。

与rule_type匹配,具体匹配关系如下:

  • “sqlid”:要限流的Unique SQL ID,以及慢SQL管控规则,格式为'{id=1234, time_limit=100, max_execute_time=500, max_iops=1}',其中id值为Unique SQL ID,为必选项,可通过dbe_perf.statement或者pg_stat_activity视图获取。其他选项非必选,其含义参考慢SQL管控规则的Hint。
  • “select”、“insert”、“update”、“delete”、“merge”: 要限流的关键字序列,不区分大小写,可以为NULL。
  • “resource”: 要限流的资源阈值,形式为'{cpu-80, memory-70}',表示触发实例级别限流的操作系统资源阈值,可以为NULL,表示不管资源利用率直接进行限流。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
gaussdb=#  SELECT gs_add_workload_rule('sqlid', 'rule for one query', '', now(), '', 20, '{id=32413214}');
 gs_add_workload_rule 
----------------------
                   1
(1 row)
gaussdb=#  CREATE database db1;
gaussdb=#  CREATE database db2;
gaussdb=#  SELECT gs_add_workload_rule('select', 'rule for select', '{db1, db2}', '', '', 100, '{tb1, tb2}');
 gs_add_workload_rule 
----------------------
                   2
(1 row)
gaussdb=#  SELECT gs_add_workload_rule('resource', 'rule for resource', '{}', '', '', 20, '{cpu-80}');
 gs_add_workload_rule 
----------------------
                   3
(1 row)

gs_update_workload_rule(rule_id, rule_name, databases, start_time, end_time, max_workload, option_val)

描述:更新一条SQL限流规则,需要重新设置全部参数,不支持只指定部分参数。需要具有sysadmin权限的用户才可执行。

参数:参数介绍请参见表2

返回值类型:BOOLEAN

表2 gs_update_workload_rule参数说明

参数名称

类型

描述

取值范围

rule_id

int8

要更新的限流规则ID。

-

rule_name

name

限流规则名称,用于检索限流规则。

任意字符串,可以为NULL。

databases

name[]

限流规则生效的数据库名称数组,区分大小写。

数据库名列表,必须为已创建的数据库名。可以为NULL,表示所有数据库生效。

目前只有指定rule_type为查询类型时,数据库列表才生效,因为Unique SQL ID本身是与库进行绑定的,其只属于某个库;而根据资源利用率的限流规则是对实例生效的,即对所有库生效。

start_time

timestamptz

限流规则生效的开始时间。

可以为NULL,表示从当前时间开始生效。

end_time

timestamptz

限流规则生效的结束时间。

可以为NULL,表示规则一直生效。

max_workload

int8

限流规则设置的最大并发数。

-

option_val

text[]

限流规则的补充信息。

与rule_type匹配,具体匹配关系如下:

  • “sqlid”:要限流的Unique SQL ID,以及慢SQL管控规则,格式为'{id=1234, time_limit=100, max_execute_time=500, max_iops=1}',其中id值为Unique SQL ID,为必选项,可通过dbe_perf.statement或者pg_stat_activity视图获取。其他选项非必选,其含义参考慢SQL管控规则的Hint。
  • “select”、“insert”、“update”、“delete”、“merge” :要限流的关键字序列,不区分大小写,可以为NULL。
  • “resource”:要限流的资源阈值,形式为'{cpu-80, memory-70}',表示触发实例级别限流的操作系统资源阈值,可以为NULL,表示不管资源利用率直接进行限流。

示例:

1
2
3
4
5
6
gaussdb=#  CREATE database db1;
gaussdb=#  SELECT gs_update_workload_rule(2, 'rule for select 2', '{db1}', now(), '', 50, '{tb1}');
 gs_update_workload_rule 
-------------------------
 t
(1 row)

gs_delete_workload_rule(rule_id int8)

描述:删除一条SQL限流规则。需要具有sysadmin权限的用户才可执行。

参数:rule_id,要更新的限流规则ID,类型为int8。

返回值类型:BOOLEAN

示例:

1
2
3
4
5
gaussdb=#  SELECT gs_delete_workload_rule(3);
 gs_delete_workload_rule 
-------------------------
 t
(1 row)

gs_get_workload_rule_stat(rule_id)

描述:查询SQL限流规则拦截SQL的次数。需要具有sysadmin权限的用户才可执行。多租场景下,non-PDB调用该函数时正常运行,PDB调用该函数时报错。

参数:rule_id,要查询的限流规则ID,类型为int8。可以指定rule_id为-1,此时表示查询所有的SQL限流规则。

表3 返回值类型说明

名称

类型

描述

rule_id

int8

SQL限流规则的ID。

validate_count

int8

SQL限流规则拦截SQL的次数。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
gaussdb=#  SELECT * FROM gs_get_workload_rule_stat(1);
 rule_id | validate_count 
---------+----------------
       1 |              0
(1 row)
gaussdb=#  SELECT * FROM gs_get_workload_rule_stat(-1);
 rule_id | validate_count 
---------+----------------
       1 |              0
       2 |              0
(2 rows)