更新时间:2026-10-21 GMT+08:00
分享

SQL限流函数

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

    描述:创建一条SQL限流规则。需要具有sysadmin权限的用户才可执行。只支持在CN节点上执行。

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

    返回值类型:int8

    表1 gs_add_workload_rule参数说明

    参数名称

    类型

    描述

    取值范围

    rule_type

    text

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

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

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

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

    “client”:根据客户端信息,包括IP、ApplicationName进行限流。

    说明:

    限流规则生效的优先级如下:

    client > resource > sqlid > select = insert = update = delete = merge

    rule_name

    name

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

    任意字符串,可以为NULL。

    databases

    name[]

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

    数据库名列表,必须为已创建的数据库名。可以为NULL,表示所有数据库生效。多个数据库之间是“或”的关系。

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

    start_time

    timestamptz

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

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

    说明:

    建议在创建限流规则时,SQL中尽量避免使用 sysdate 作为限流规则的开始时间和结束时间,因为 sysdate 的精度仅到秒级,其秒后的小数部分会被四舍五入,可能导致限流规则在极短时间内不生效,推荐使用now()替换sysdate。

    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调优指南》中“使用Plan Hint进行调优 > 设置慢SQL管控规则的Hint”章节。
    • “select”、“insert”、“update”、“delete”、“merge” :要限流的关键字序列,不区分大小写,可以为NULL。多个关键字之间是“且”的关系。
    • “resource” :要限流的资源阈值,形式为'{cpu-80, memory-70}'。需要注意的是,无论当前cpu和memory设置为多少,都当成“0”处理。即:无论实际的cpu和内存使用率是多少,都会触发此限流规则。
    • “client”:要限流的客户端信息,包括IP、ApplicationName,格式为'{ip=192.168.1.1, appname=app1}',其中ip或appname至少指定其中之一。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    gaussdb=#  SELECT gs_add_workload_rule('sqlid', 'rule for one query', '{}', now(), NULL, 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}', NULL, NULL, 100, '{tb1, tb2}');
     gs_add_workload_rule 
    ----------------------
                       2
    (1 row)
    
    gaussdb=#  SELECT gs_add_workload_rule('resource', 'rule for resource', '{}', NULL, NULL, 20, '{cpu-80}');
     gs_add_workload_rule 
    ----------------------
                       3
    (1 row)
    
    gaussdb=# SELECT gs_add_workload_rule('client', 'rule for client', '{}', NULL, NULL, 20, '{appname=app1}');
     gs_add_workload_rule 
    ----------------------
                       4
    (1 row)
    
    gaussdb=#  SELECT gs_delete_workload_rule(rule_id) FROM gs_workload_rule; -- 删除全部限流规则
     gs_delete_workload_rule 
    -------------------------
     t
     t
     t
     t
    (4 rows)
    
    gaussdb=#  DROP DATABASE db1;
    gaussdb=#  DROP DATABASE db2;
    
  • gs_update_workload_rule(rule_id, rule_name, databases, start_time, end_time, max_workload, option_val)

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

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

    返回值类型:BOOLEAN

    表2 gs_update_workload_rule参数说明

    参数名称

    类型

    描述

    取值范围

    rule_id

    int8

    要更新的限流规则ID。

    -

    rule_name

    name

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

    任意字符串,可以为NULL。

    databases

    name[]

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

    数据库名列表,必须为已创建的数据库名。可以为NULL,表示所有数据库生效。多个数据库之间是“或”的关系。

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

    start_time

    timestamptz

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

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

    说明:

    建议在更新限流规则时,SQL中尽量避免使用 sysdate 作为限流规则的开始时间和结束时间,因为 sysdate 的精度仅到秒级,其秒后的小数部分会被四舍五入,可能导致限流规则在极短时间内不生效,推荐使用now()替换sysdate。

    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调优指南》中“使用Plan Hint进行调优 > 设置慢SQL管控规则的Hint”章节。
    • “select”、“insert”、“update”、“delete”、“merge”:要限流的关键字序列,不区分大小写,可以为NULL。多个关键字之间是“且”的关系。
    • “resource” :要限流的资源阈值,形式为'{cpu-80, memory-70}'。需要注意的是,当前cpu和memory无论设置为多少,都当成“0"处理。即:无论实际的cpu和内存使用率是多少,都会触发此限流规则。
    • “client”:要限流的客户端信息,包括IP、ApplicationName,格式为'{ip=192.168.1.1, appname=app1}',其中ip或appname至少指定其中之一。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    gaussdb=#  CREATE DATABASE db1;
    gaussdb=#  SELECT gs_add_workload_rule('select', 'rule for select', '{db1}', NULL, NULL, 100, '{tb1, tb2}');
     gs_add_workload_rule 
    ----------------------
                        5
    (1 row)
    
    gaussdb=#  SELECT gs_update_workload_rule(5, 'rule for select 2', '{db1}', now(), NULL, 50, '{tb1}');
     gs_update_workload_rule 
    -------------------------
     t
    (1 row)
    
    gaussdb=#  SELECT gs_delete_workload_rule(rule_id) FROM gs_workload_rule; -- 删除全部限流规则
     gs_delete_workload_rule 
    -------------------------
     t
    (1 row)
    
    gaussdb=#  DROP DATABASE db1;
    
  • gs_delete_workload_rule(rule_id)

    描述:删除一条SQL限流规则。需要具有sysadmin权限的用户才可执行。只支持在CN节点上执行。

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

    返回值类型:BOOLEAN

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    gaussdb=#  SELECT gs_add_workload_rule('sqlid', 'rule for one query', '{}', NULL, NULL, 20, '{id=32413214}');
     gs_add_workload_rule 
    ----------------------
                        6
    (1 row)
    
    gaussdb=#  SELECT gs_delete_workload_rule(6);
     gs_delete_workload_rule 
    -------------------------
     t
    (1 row)
    
  • gs_get_workload_rule_stat(rule_id)

    描述:查询SQL限流规则拦截SQL的次数。需要具有sysadmin权限的用户才可执行。只支持在CN节点上执行。

    参数: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
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    gaussdb=#  SELECT gs_add_workload_rule('sqlid', 'rule for one query', '{}', now(), NULL, 20, '{id=32413214}');
     gs_add_workload_rule 
    ----------------------
                        7
    (1 row)
    
    gaussdb=#  SELECT gs_add_workload_rule('resource', 'rule for resource', '{}', NULL, NULL, 20, '{cpu-80}');
     gs_add_workload_rule 
    ----------------------
                        8
    (1 row)
    
    gaussdb=#  SELECT * FROM gs_get_workload_rule_stat(7);
     rule_id | validate_count 
    ---------+----------------
           7 |              0
    (1 row)
    
    gaussdb=#  SELECT * FROM gs_get_workload_rule_stat(-1);
     rule_id | validate_count 
    ---------+----------------
           7 |              0
           8 |              0
    (2 rows)
    
    gaussdb=#  SELECT gs_delete_workload_rule(rule_id) FROM gs_workload_rule;
     gs_delete_workload_rule 
    -------------------------
     t
     t
    (2 rows)
    
  • gs_refresh_workload_rule_cache()

    描述:刷新限流规则缓存,使其与限流规则系统表中的数据重新保持一致。不支持在事务中执行。需要具有sysadmin权限的用户才可执行。

    返回值类型:BOOLEAN

    当在事务中对限流规则执行增、删、改操作且该事务最终发生回滚时,由于限流规则缓存无法感知事务回滚,系统表将恢复至事务开始前的状态,而限流规则缓存仍会保留变更后的内容,从而导致系统表与限流规则缓存数据不一致,此时需及时调用本函数手动同步。

相关文档