
# CREATE EXCEPT RULE
#### 功能描述
用于创建一个异常规则集合。创建时可以指定任意一个或者多个具体的规则阈值，也可以指定触发异常规则后所采取的操作，当前支持终止（abort）和降级（penalty）操作。
分布式数据库中，查询任务由多个节点并行执行，每个节点独立处理部分数据并汇总结果。但若任一节点出现性能瓶颈，即使其他节点快速完成，整个查询仍会被拖慢。在某些极端情况下，一个查询语句可能会占用大量资源，导致节点资源使用率过高，从而引发计算资源或存储资源不足的问题，不仅影响业务运行，还可能导致整个集群性能下降甚至不可用。
DWS提供配置**异常规则**功能，允许用户设置查询的资源限制（如执行时间、内存、磁盘等），SQL语句在执行时触发异常规则会自动终止，避免异常查询拖垮集群，保障稳定性并减轻DBA运维负担。例如设置查询的最大执行时间，超时则自动终止；设置查询可以使用的磁盘空间大小，超过阈值则自动终止；或者设置查询可以使用的内存量，超过限制则终止。
在DWS资源负载管理中，异常规则需要绑定到资源池后生效，紧接着将执行作业的用户绑定到指定资源池后，总体上才能达到资源负载管理的效果，当用户执行某作业时，若触发异常规则，则作业将被终止。
您也可以**通过管理控制台** 进行资源池和异常规则设置，了解**资源池、异常规则** 介绍及配置，可参见[DWS资源管理](https://support.huaweicloud.com/mgtg-dws/dws_01_1510.html)。
#### 注意事项
**同一组异常规则中的多个规则以"且"的关系生效** ，例如：同时设置执行时间elapsedtime=1000，内存大小memsize=500。表示一个作业，执行时间达到1000秒且内存使用达到500MB时，才会终止该作业。**仅触发其中一个不会生效。**
#### 语法格式
```
CREATE EXCEPT RULE except_rule_name
       WITH (
            | BLOCKTIME = VALUE,
            | CPUTIME = VALUE,
            | ELAPSEDTIME = VALUE, 
            | CPUSKEWPERCENT = VALUE,
            | SPILLSIZE = VALUE,
            | BROADCASTSIZE = VALUE,
            | MEMSIZE = VALUE,
            | CPUAVGPERCENT = VALUE,
            | BANDWIDTH = VALUE,
            | ACTION = ['abort' | 'penalty']
            );
```
#### 参数说明
表1CREATE EXCEPT RULE参数说明 
| 参数             | 描述                     | 取值范围                                                                                                                                                   |
|:---|:---|:---|
| rule_name      | 异常规则集名称。               | 字符串，要符合标识符的命名规范。参见[标识符命名规范](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0007.html#ZH-CN_TOPIC_0000002202094021__section1475018612353)。 |
| blocktime      | 作业排队阻塞的最大时间，单位：秒。      | 数值型，-1，1\~INT64_MAX。-1表示不设置，即不限制，下同。                                                                                                                   |
| elapsedtime    | 作业执行的最大时间，单位：秒。        | 数值型，-1，1\~INT64_MAX。                                                                                                                                   |
| allcputime     | 作业运行中使用的最大CPU时间，单位：秒。  | 数值型，-1，1\~INT64_MAX。                                                                                                                                   |
| cpuskewpercent | 作业执行时的平均CPU使用率，单位：百分比。 | 数值型，-1，1\~100。                                                                                                                                         |
| cpuavgpercent  | 作业执行时的CPU使用倾斜率，单位：百分比。 | 数值型，-1，1\~100。                                                                                                                                         |
| spillsize      | 作业执行的最大下盘大小，单位：MB。     | 数值型，-1，1\~INT64_MAX。                                                                                                                                   |
| broadcastsize  | 作业执行的最大广播大小，单位：MB。     | 数值型，-1，1\~INT64_MAX。                                                                                                                                   |
| memsize        | 作业执行使用的最大内存大小，单位：MB。   | 数值型，-1，1\~INT64_MAX。                                                                                                                                   |
| bandwidth      | 作业执行可使用的最大带宽，单位：MB。    | 数值型，-1，1\~INT64_MAX。                                                                                                                                   |
   
#### 基础示例
创建一个异常规则集except_rule1并指定其排队阻塞时间blocktime为3000秒，下盘空间为4000MB，即某个语句排队阻塞超过3000秒且下盘空间超过4000MB，该语句会被终止。
```
DROP EXCEPT RULE IF EXISTS except_rule1;
CREATE EXCEPT RULE except_rule1 WITH (blocktime=3000, spillsize=4000, action=abort);
```
创建一个异常规则集except_rule2并指定其memsize规则阈值为5000MB，默认所采取的异常规则操作为abort。
```
DROP EXCEPT RULE IF EXISTS except_rule2;
CREATE EXCEPT RULE except_rule2 WITH (memsize=3000);
```
创建一个资源池并绑定异常规则集except_rule1。
```
DROP resource pool IF EXISTS resource_pool_a1;
CREATE resource pool resource_pool_a1 WITH (except_rule='except_rule1');
```
#### 示例：创建异常规则，当作业执行时间超过10秒，则终止该作业
在DWS资源负载管理中，异常规则需要绑定到资源池后生效，紧接着将执行作业的用户绑定到指定资源池后，总体上才能达到资源负载管理的效果，当用户执行某作业时，若触发异常规则，则作业将被终止，以下示例模拟了这一终止过程。
1. 先创建一个测试表并导入数据。 
   1. 以系统管理员连接数据库执行以下SQL，创建一个名为src的临时表，为后续的INSERT操作提供数据源。
      ```
      DROP SCHEMA IF EXISTS test CASCADE;
      CREATE SCHEMA test;
      CREATE TABLE test.src AS SELECT 1;
      ```
      
   
   2. 执行以下SQL，创建表test.test。
      ```
      DROP TABLE IF EXISTS test.test;
      CREATE TABLE test.test(a int, b numeric(15,2)) WITH(orientation=column);
      ```
      
   
   3. 执行以下SQL，分别为两张表插入2000万行数据。执行时间约半分钟，请等待。
      ```
      INSERT INTO test.test SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM test.src;
      ```
      
   
   
   
   
2. 创建一个异常规则集except_rule4，设置执行的最大时间elapsedtime为10秒 
   ```
   DROP EXCEPT RULE IF EXISTS except_rule4;
   CREATE EXCEPT RULE except_rule4 WITH (elapsedtime=10);
   ```
   
   
3. 创建一个资源池resource_pool_a4，并将异常规则绑定到该资源池。 
   ```
   DROP resource pool IF EXISTS resource_pool_a4;
   CREATE resource pool resource_pool_a4 WITH (except_rule='except_rule4');
   ```
   
   
4. 创建一个作业用户，并绑定到资源池resource_pool_a4中，密码请用户自定义。 
   ```
   CREATE USER user4 RESOURCE POOL 'resource_pool_a4' PASSWORD '{password}';
   ```
   
   
5. 授权作业用户user4可以访问表test.test。 
   ```
   GRANT USAGE ON SCHEMA test TO user4;
   GRANT SELECT ON TABLE test.test TO user4;
   ```
   
   
6. 以作业用户user4连接数据库，执行以下SQL，超过10秒，语句被终止了。 
   ```
   SELECT * FROM test.test;
   ```
   ![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002504143063.png "点击放大")
   
   
7. 通过**[PG_EXCEPT_RULE](https://support.huaweicloud.com/devg-dws/dws_04_1201.html)** 系统表，可以查看异常规则定义。
   
   ```
   SELECT * FROM PG_EXCEPT_RULE WHERE name = 'except_rule4';
   ```
   ![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002471321244.png "点击放大")
   
   
 
#### 相关链接
[ALTER EXCEPT RULE](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0280.html)，[DROP EXCEPT RULE](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0282.html)，[CREATE RESOURCE POOL](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0171.html)
[使用实践：为两种作业绑定不同资源池以实现DWS资源负载能力](https://support.huaweicloud.com/bestpractice-dws/dws_05_0075.html)
