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