
# 特性概述
#### 用户场景
在数据库系统运行过程中，时常会遇到突发的业务请求流量过高、或者某些SQL占用资源过高的情况。SQL限流功能可以限制此类SQL的执行，阻止其耗尽数据库资源从而影响正常业务SQL的执行。
#### 功能描述
本特性可以实现多种规则的SQL限流能力，限制CN进程级别的某类SQL语句或全部SQL语句的最大并发数，包括：
- 根据Unique SQL ID进行限流：在明确某条SQL为慢SQL或者占用资源较高时，可以通过Unique SQL ID对该SQL进行限流，避免业务大量执行此SQL而影响其他业务；
- 根据SQL类型及关键字进行限流：在明确某类SQL请求可能会随业务量增长而增长的时候，使用SQL类型和关键字对此类SQL进行限流；
- 根据客户端信息进行限流：在明确某客户端业务会占用资源较高时，可通过客户端信息，包括IP、ApplicationName，进行限流，避免该客户端业务大量执行SQL而影响其他业务。
- 由于某些业务高峰是可以预知的，在仅希望在业务高峰时段对SQL请求进行限制的情况下，可以设置SQL限流的生效时间，避免限流规则常驻系统；
- 当只希望限流规则作用于业务库，而对系统库的SQL不做控制，可以按不同库的维度进行限流；
- 除了对某类SQL进行限流，本特性还提供CN进程级别的限流能力；
- 对于限流规则，提供查询统计的能力，可以查询所有的限流规则，并根据规则列表对限流规则进行管理。此外还可以查询限流规则的生效次数。
#### 规格约束
- 只支持在CN上限流。
- 对于Unique SQL ID限流，需要设置GUC参数enable_resource_track = on，instr_unique_sql_count \> 0。
- 对于关键字限流，按照并发度排序，并发度越低优先级越高。关键字不区分大小写，支持模糊匹配。
- 对于客户端信息限流，优先采用精确匹配规则（需同时匹配IP与ApplicationName）。若无生效的精确匹配规则，则针对仅匹配IP或仅匹配ApplicationName的规则，按并发度升序排序，并发度越低者优先级越高。所有关键字均区分大小写，且不支持模糊匹配。
- 数据库名称区分大小写。删除某个数据库，再创建同名的数据库，会导致所有已录入的针对这个数据库的限流规则失效。
- 基于资源的CN进程级别最大活跃并发数限流，按照并发度排序，并发度越低优先级越高，资源利用率的采集存在10s左右的时间差。
- 对于限流周期结束的规则，系统会在下次限流规则触发时将其缓存中的is_valid标记为false。系统表内的is_valid字段由后台线程负责检测与刷新，该过程存在延迟，最长延迟时间不超过10分钟。
- 在事务中对限流规则执行了增、删、改操作且该事务最终被回滚时，会导致限流规则缓存中的数据与限流规则系统表不一致，此时需及时调用gs_refresh_workload_rule_cache函数刷新限流规则缓存。
- 对于SQL限流次数的统计是数据库从启动到当前的累计次数，重启后从0开始统计。
- 游标、存储过程中的SQL语句不会被限流。
- 管理员用户执行的SQL语句不会被限流。
- 限流规则数据库间不共享，创建限流规则时需要连接目标库。如果创建限流规则的CN被剔除并触发全量Build，则会继承全量Build目标CN中的限流规则，因此建议尽量在各个CN上都创建对应的限流规则。
- CN之间由于Unique SQL ID不同，不共享限流规则，需要用户手动在不同的CN上创建对应的限流规则。
 
