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

使用DWS查询过滤器拦截慢SQL

功能介绍

在使用DWS过程中经常会遇到因慢SQL导致整个集群系统性能变差甚至不可用等痛点问题,对此DWS提供了查询过滤器功能,支持通过建立过滤规则提前进行语句拦截。

查询过滤器可以通过SQL ID对慢SQL语句进行拦截,同时结合异常规则功能在触发异常规则次数达到设定的临界值时,自动将触发异常规则的SQL语句ID添加到查询过滤器的黑名单中进行拦截。除此之外查询过滤器还提供了更丰富的拦截规则,例如SQL Hash和正则匹配等更灵活的拦截方式,支持将拦截规则绑定到某一用户或某一数据库。

应用场景

主要应用场景包含以下两种:

  • 异常熔断机制:配置异常规则后,作业频繁触发异常规则,对于触发异常规则次数达到阈值的查询自动加入拦截列表进行过滤。
  • 紧急拦截:作业引发CORE、hang或性能大幅下降等问题时,需要紧急规避时,可以将作业加入拦截列表进行过滤。

约束与限制

查询过滤器仅9.1.0.200及以上集群版本支持。

创建查询过滤器

  1. 登录DWS管理控制台
  2. 在集群列表中单击指定集群名称,进入“集群详情”页面。
  3. 在导航栏单击“资源管理”
  4. 切换至“查询过滤器”页签,单击“创建查询过滤器”,查询过滤器参数配置说明请参见表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会直接报错;开启后不报错,仅做告警提示。

  5. 确认无误后,单击“确定”

查询过滤器管理操作

  1. 登录DWS管理控制台
  2. 在集群列表中单击指定集群名称,进入“集群详情”页面。
  3. 在导航栏单击“资源管理”
  4. 切换至“查询过滤器”页签,用户可对查询过滤器进行编辑删除操作。操作步骤如下所示。

    表2 查询过滤器管理操作

    操作入口

    说明

    编辑

    单击指定查询过滤器操作列的“编辑”,编辑查询过滤器参数说明可参见表1

    删除

    单击指定查询过滤器操作列的“删除”,删除查询过滤器。

  5. 确认无误后,单击“确定”

应用示例

本示例以创建拦截dbadmin用户通过test_application客户端在test_bond作业标识下对test_table表的查询过滤器为例。

  1. 登录DWS管理控制台
  2. 在集群列表中单击指定集群名称,进入“集群详情”页面。
  3. 在导航栏单击“资源管理”
  4. 切换至“查询过滤器”页签,单击“创建查询过滤器”。示例涉及参数说明如下所示(其他参数默认不填写):

    • 数据库名称:选择“gaussdb”
    • 规则名称:输入“test_block”
    • SQL:输入“SELECT \*FROM test_table”
    • 语句类型:选择“SELECT”
    • 绑定用户:选择“dbadmin”
    • 客户端名称:输入“test_application”
    • 作业类型:输入“test_band”
      图2 创建过滤器

  5. 单击“确定”查询过滤器创建成功,返回集群列表。
  6. 在左侧导航栏中,选择“数据 > 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 创建数据源表

  7. 对源表进程查询,观察拦截是否生效。满足条件的查询被拦截,则查询过滤器生效。

    SET query_band='test_band';
    SET application_name='test_application';
    SELECT * FROM test_table WHERE a < 2;
    图4 查询过滤器拦截成功

  8. 如需移除test_block”拦截规则,可返回“查询过滤器”页签,在该规则的操作列单击“删除”进行移除。

相关文档