
# CREATE RESOURCE POOL
#### 功能描述
创建一个资源池，并指定此资源池相关联的控制组。数据库的系统资源（CPU资源、内存资源、IO资源和存储资源）是有限的，DWS在同时运行多种类型的业务（如数据加载、批量分析、实时查询等）时，各类型业务之间可能会竞争资源，从而出现资源性能瓶颈，导致吞吐量下降，造成整体性能低下。那么对系统的资源进行合理的分配，能避免产生资源不合理利用而导致的系统运行效率下降等问题，因此DWS提供了**资源管理功能**，用户可以根据自身业务将资源按需划分成不同的资源池，不同资源池之间资源互相隔离。
本语法为基础语法仅供参考，当前**推荐通过[管理控制台](https://support.huaweicloud.com/mgtg-dws/dws_01_07231.html)进行资源池创建** ，了解资源池更多内容，请参见[DWS资源负载管理](https://support.huaweicloud.com/mgtg-dws/dws_01_1510.html)。
#### 注意事项
只要用户对当前数据库有CREATE权限，就可以创建资源池。
#### 语法格式
```
CREATE RESOURCE POOL pool_name
    [WITH ({MEM_PERCENT=pct | CONTROL_GROUP="group_name" | ACTIVE_STATEMENTS=stmt | MAX_DOP = dop | MEMORY_LIMIT='memory_size' | io_limits=io_limits | io_priority='priority' | nodegroup='nodegroup_name' | is_foreign = boolean | except_rule='except_rule' | weight=bandwidth_weight | enable_concurrency_scaling=boolean}[, ... ])];
```
#### 参数说明
表1CREATE RESOURCE POOL参数说明 
| 参数                         | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 取值范围或示例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|
| pool_name                  | 资源池名称。 资源池名称不能和当前数据库里已有的资源池重名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                                                                                                                                                                 |
| CONTROL_GROUP              | 控制组名称。 控制组（Cgroups）是control groups的缩写，是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源（如：CPU、内存、IO等）的机制。如果一个进程加入了某一个控制组，该控制组对Linux的系统资源都有严格的限制，进程在使用这些资源时，不能超过其最大限制。更多Cgroups的原理介绍，请查看相关操作系统的产品手册。 环境中已预置存在**DefaultClass控制组**，而DefaultClass控制组下层Timeshare控制组又分为以下4个层级："Rush"、"High"、"Medium"或"Low"。 - 设置控制组名称时，语法可以使用双引号，也可以使用单引号。  - group_name对大小写敏感。  - 不指定group_name时，默认指定的字符串为"Medium"，代表指定DefaultClass控制组的"Medium"Timeshare控制组。   | 创建一个默认资源池，其控制组为"DefaultClass"组下属的"Medium"Timeshare Workload控制组。 ``` CREATE RESOURCE POOL pool1; ``` 创建一个资源池，其控制组指定为"DefaultClass"组下属的"High"Timeshare Workload控制组。 ``` CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High"); ```                                                                                                                                                         |
| ACTIVE_STATEMENTS          | 资源池**复杂** **语句**执行的最大并发数量。数值型，-1\~INT_MAX，不指定时，默认是10。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 创建资源池pool3，设定复杂语句执行的最大并发数量为5，内存使用比例50%，网络权重为5。 ``` CREATE RESOURCE POOL pool3 WITH (ACTIVE_STATEMENTS=5, MEM_PERCENT=50, weight=5); ```                                                                                                                                                                                                                                                                                                   |
| MAX_DOP                    | 资源池**简单语句**执行的最大并发数量。数值型，-1\~INT_MAX，-1和0代表不限制，不指定时，默认为-1，不限制。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 创建资源池pool4，设定简单语句执行最大并发数量为10。 ``` CREATE RESOURCE POOL pool4 WITH (MAX_DOP=10); ```                                                                                                                                                                                                                                                                                                                                   |
| MEMORY_LIMIT               | 使用该资源池的作业估算内存上限。 取值为字符串。 - default，表示最大为资源池内存一半。  - unlimited，表示不限制。  - 数值范围为1KB\~2047GB。   不指定时，默认为default。                                                                                                                                                                                                                                                                                                                                                                   | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| MEM_PERCENT                | 资源池可用内存占全部内存或者组用户内存使用的比例。 - 取值范围为0-100，默认值为0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| io_limits                  | 该参数8.1.2版本中已废弃，为兼容历史版本保留该参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| io_priority                | 该参数8.1.2版本中已废弃，为兼容历史版本保留该参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| nodegroup                  | 在逻辑集群模式下，指定资源池所属的逻辑集群名称。必须是存在的逻辑集群。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 如果逻辑集群名称包含大写字符、特殊符号或以数字开头，SQL语句中对逻辑集群名称需要加双引号。                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| is_foreign                 | 在逻辑集群模式下，指定当前资源池用于控制没有关联本逻辑集群的普通用户的资源。这里的逻辑集群是由资源池nodegroup字段指定的。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | - nodegroup必须是存在的逻辑集群，不能是elastic_group和安装的nodegroup (group_version1)。  - 如果指定了is_foreign为true，则资源池不能再关联用户，即不允许通过CREATE USER ... RESOURCE POOL语句来将该资源池配置给用户。该资源池自动检查用户是否关联到资源池指定的逻辑集群，如果用户没有关联到该逻辑集群，则这些用户在逻辑集群所包含的DN上运行将受到该资源池的资源控制。   |
| except_rule                | 异常规则集。 **异常规则集**是由一组定义了作业执行时间、作业排队时间、CPU使用率、最大落盘等各项规则阈值的集合，与资源池绑定搭配后使用，当用户执行作业时，触发了异常规则，则作业会选择终止或者降级。 了解更多，请参见[CREATE EXCEPT RULE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0281.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [示例：创建异常规则，当作业执行时间超过10秒，则终止该作业]                                                                                                                                                                                                                                                                                                                                                                                                     |
| weight                     | 资源池网络带宽权重。取值范围为-1\~2147483647的整数，默认配置为-1，不设置权重。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| enable_concurrency_scaling | 弹性并发扩展功能开关。该功能仅9.1.0.100及以上集群版本支持。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | - true表示开启该资源池作业的弹性并发扩展功能。  - false表示关闭该资源池作业的弹性并发扩展功能。   默认值：false                                                                                                                                                                      |
   
#### 示例
本示例假定用户已预先成功创建控制组。
创建一个默认资源池，其控制组为"DefaultClass"组下属的"Medium"Timeshare Workload控制组。
```
DROP RESOURCE POOL IF EXISTS pool1;
CREATE RESOURCE POOL pool1;
```
创建一个资源池，其控制组指定为"DefaultClass"组下属的"High"Timeshare Workload控制组。
```
DROP RESOURCE POOL IF EXISTS pool2;
CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High");
```
创建资源池pool_p，设定复杂语句执行的最大并发数量为5，内存使用比例50%，网络权重为5。
```
DROP RESOURCE POOL IF EXISTS pool_p;
CREATE RESOURCE POOL pool_p WITH (ACTIVE_STATEMENTS=5, MEM_PERCENT=50, weight=5);
```
可通过[PG_RESOURCE_POOL](https://support.huaweicloud.com/devg-dws/dws_04_0613.html)系统表查询资源池的配置参数。
```
SELECT * FROM PG_RESOURCE_POOL WHERE respool_name = 'pool_p';
```
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002504906685.png "点击放大")
创建一个异常规则集except_rule4，设置执行的最大时间elapsedtime为10秒，并创建一个资源池同时绑定异常规则。
```
DROP RESOURCE POOL IF EXISTS resource_pool_a4;
DROP EXCEPT RULE IF EXISTS except_rule4;
CREATE EXCEPT RULE except_rule4 WITH (elapsedtime=10);
CREATE resource pool resource_pool_a4 WITH (except_rule='except_rule4');
```
创建一个资源池，并打开该资源池的弹性并发扩展功能。
```
DROP RESOURCE POOL IF EXISTS pool6;
CREATE RESOURCE POOL pool6 WITH (enable_concurrency_scaling=true);
```
 #### 示例：创建异常规则，当作业执行时间超过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-dws/figure/zh-cn_image_0000002471311742.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-dws/figure/zh-cn_image_0000002504037263.png "点击放大")
   
   
   
#### 相关链接
[ALTER RESOURCE POOL](https://support.huaweicloud.com/sqlreference-dws/dws_06_0133.html)，[DROP RESOURCE POOL](https://support.huaweicloud.com/sqlreference-dws/dws_06_0202.html)，[CREATE EXCEPT RULE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0281.html)
[使用实践：为两种作业绑定不同资源池以实现DWS资源负载能力](https://support.huaweicloud.com/bestpractice-dws/dws_05_0075.html)
