使用DWS查询过滤器拦截慢SQL
功能介绍
在使用DWS过程中经常会遇到因慢SQL导致整个集群系统性能变差甚至不可用等痛点问题,对此DWS提供了查询过滤器功能,支持通过建立过滤规则提前进行语句拦截。
查询过滤器可以通过SQL ID对慢SQL语句进行拦截,同时结合异常规则功能在触发异常规则次数达到设定的临界值时,自动将触发异常规则的SQL语句ID添加到查询过滤器的黑名单中进行拦截。除此之外查询过滤器还提供了更丰富的拦截规则,例如SQL Hash和正则匹配等更灵活的拦截方式,支持将拦截规则绑定到某一用户或某一数据库。
应用场景
主要应用场景包含以下两种:
- 异常熔断机制:配置异常规则后,作业频繁触发异常规则,对于触发异常规则次数达到阈值的查询自动加入拦截列表进行过滤。
- 紧急拦截:作业引发CORE、hang或性能大幅下降等问题时,需要紧急规避时,可以将作业加入拦截列表进行过滤。
约束与限制
查询过滤器仅9.1.0.200及以上集群版本支持。
创建查询过滤器
- 登录DWS管理控制台。
- 在集群列表中单击指定集群名称,进入“集群详情”页面。
- 在导航栏单击“资源管理”。
- 切换至“查询过滤器”页签,单击“创建查询过滤器”,查询过滤器参数配置说明请参见表1。
图1 添加查询过滤器
表1 查询过滤器字段说明 字段名
是否必填
说明
数据库名称
是
下拉框选择数据库。
规则名称
是
查询过滤器的名称,支持数字大小写字母_$,有唯一性判断,支持3-63位长度。
匹配SQL类型
是
可在SQL/SQL ID/SQL Hash中选择:
- SQL:查询过滤规则匹配的SQL语句。
- SQL ID:查询过滤规则匹配的unique_sql_id值。通过查询视图GS_WLM_SESSION_INFO中的“unique_sql_id”字段得出。
- SQL Hash:查询过滤规则匹配的sql_hash值。通过查询视图GS_WLM_SESSION_INFO中的“sql_hash”字段得出。
语句类型
否
分别对应SELECT/UPDATE/INSERT/DELETE/MERGE,默认为全部。
绑定用户
否
可对指定用户生效。
客户端名称
否
用于标识连接到数据库的应用程序的名称,允许客户为每个连接指定一个自定义的应用程序名称,例如gsql。
客户端IP地址
否
可对指定IP生效。
最大分区数
否
计划预估扫描节点的最大分区数。
最大表数
否
计划预估扫描的最大表数。
最大行数
否
计划预估扫描节点的最大行数。
作业类型
否
主动标识的作业类型,使用query_band负载识别标记过的作业类型,详情请参见query_band负载识别。
资源池名称
否
过滤规则匹配的资源池名称。
最大并发数
否
过滤规则对应语句最大并发数。
告警行为
否
过滤规则告警行为,控制拦截到语句的行为是告警还是报错。未开启该选项时,满足过滤器条件的SQL会直接报错;开启后不报错,仅做告警提示。
- 确认无误后,单击“确定”。
查询过滤器管理操作
- 登录DWS管理控制台。
- 在集群列表中单击指定集群名称,进入“集群详情”页面。
- 在导航栏单击“资源管理”。
- 切换至“查询过滤器”页签,用户可对查询过滤器进行编辑和删除操作。操作步骤如下所示。
表2 查询过滤器管理操作 操作入口
说明
编辑
单击指定查询过滤器操作列的“编辑”,编辑查询过滤器参数说明可参见表1。
删除
单击指定查询过滤器操作列的“删除”,删除查询过滤器。
- 确认无误后,单击“确定”。
应用示例
本示例以创建拦截dbadmin用户通过test_application客户端在test_bond作业标识下对test_table表的查询过滤器为例。
- 登录DWS管理控制台。
- 在集群列表中单击指定集群名称,进入“集群详情”页面。
- 在导航栏单击“资源管理”。
- 切换至“查询过滤器”页签,单击“创建查询过滤器”。示例涉及参数说明如下所示(其他参数默认不填写):
- 数据库名称:选择“gaussdb”。
- 规则名称:输入“test_block”。
- SQL:输入“SELECT \*FROM test_table”。
- 语句类型:选择“SELECT”。
- 绑定用户:选择“dbadmin”。
- 客户端名称:输入“test_application”。
- 作业类型:输入“test_band”。
图2 创建过滤器
- 单击“确定”查询过滤器创建成功,返回集群列表。
- 在左侧导航栏中,选择“数据 > SQL编辑器”。成功连接数据源后,在编辑面板创建数据源表“test_table”,SQL示例如下所示:
CREATE TABLE test_table(a int,b int); INSERT INTO test_table(a,b) SELECT generate_series(1,100), generate_series(1,100);
图3 创建数据源表
- 对源表进程查询,观察拦截是否生效。满足条件的查询被拦截,则查询过滤器生效。
SET query_band='test_band'; SET application_name='test_application'; SELECT * FROM test_table WHERE a < 2;
图4 查询过滤器拦截成功
- 如需移除“test_block”拦截规则,可返回“查询过滤器”页签,在该规则的操作列单击“删除”进行移除。