CREATE RESOURCE POOL
功能描述
创建一个资源池,并指定此资源池相关联的控制组。数据库的系统资源(CPU资源、内存资源、IO资源和存储资源)是有限的,DWS在同时运行多种类型的业务(如数据加载、批量分析、实时查询等)时,各类型业务之间可能会竞争资源,从而出现资源性能瓶颈,导致吞吐量下降,造成整体性能低下。那么对系统的资源进行合理的分配,能避免产生资源不合理利用而导致的系统运行效率下降等问题,因此DWS提供了资源管理功能,用户可以根据自身业务将资源按需划分成不同的资源池,不同资源池之间资源互相隔离。
注意事项
只要用户对当前数据库有CREATE权限,就可以创建资源池。
语法格式
1 2 |
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}[, ... ])]; |
参数说明
|
参数 |
描述 |
取值范围或示例 |
||||
|---|---|---|---|---|---|---|
|
pool_name |
资源池名称。 资源池名称不能和当前数据库里已有的资源池重名。 |
字符串,需符合标识符命名规范。 |
||||
|
CONTROL_GROUP |
控制组名称。 控制组(Cgroups)是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如:CPU、内存、IO等)的机制。如果一个进程加入了某一个控制组,该控制组对Linux的系统资源都有严格的限制,进程在使用这些资源时,不能超过其最大限制。更多Cgroups的原理介绍,请查看相关操作系统的产品手册。 环境中已预置存在DefaultClass控制组,而DefaultClass控制组下层Timeshare控制组又分为以下4个层级:“Rush”、“High”、“Medium”或“Low”。
|
创建一个默认资源池,其控制组为“DefaultClass”组下属的“Medium”Timeshare Workload控制组。
创建一个资源池,其控制组指定为“DefaultClass”组下属的“High”Timeshare Workload控制组。
|
||||
|
ACTIVE_STATEMENTS |
资源池复杂语句执行的最大并发数量。数值型,-1~INT_MAX,不指定时,默认是10。 |
创建资源池pool3,设定复杂语句执行的最大并发数量为5,内存使用比例50%,网络权重为5。
|
||||
|
MAX_DOP |
资源池简单语句执行的最大并发数量。数值型,-1~INT_MAX,-1和0代表不限制,不指定时,默认为-1,不限制。 |
创建资源池pool4,设定简单语句执行最大并发数量为10。
|
||||
|
MEMORY_LIMIT |
使用该资源池的作业估算内存上限。 取值为字符串。
不指定时,默认为default。 |
- |
||||
|
MEM_PERCENT |
资源池可用内存占全部内存或者组用户内存使用的比例。
|
- |
||||
|
io_limits |
该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 |
- |
||||
|
io_priority |
该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 |
- |
||||
|
nodegroup |
在逻辑集群模式下,指定资源池所属的逻辑集群名称。必须是存在的逻辑集群。 |
如果逻辑集群名称包含大写字符、特殊符号或以数字开头,SQL语句中对逻辑集群名称需要加双引号。 |
||||
|
is_foreign |
在逻辑集群模式下,指定当前资源池用于控制没有关联本逻辑集群的普通用户的资源。这里的逻辑集群是由资源池nodegroup字段指定的。 |
|
||||
|
except_rule |
异常规则集。 异常规则集是由一组定义了作业执行时间、作业排队时间、CPU使用率、最大落盘等各项规则阈值的集合,与资源池绑定搭配后使用,当用户执行作业时,触发了异常规则,则作业会选择终止或者降级。 了解更多,请参见CREATE EXCEPT RULE。 |
|||||
|
weight |
资源池网络带宽权重。取值范围为-1~2147483647的整数,默认配置为-1,不设置权重。 |
- |
||||
|
enable_concurrency_scaling |
弹性并发扩展功能开关。该功能仅9.1.0.100及以上集群版本支持。 |
默认值:false |
示例
本示例假定用户已预先成功创建控制组。
创建一个默认资源池,其控制组为“DefaultClass”组下属的“Medium”Timeshare Workload控制组。
1
|
CREATE RESOURCE POOL pool1; |
创建一个资源池,其控制组指定为“DefaultClass”组下属的“High”Timeshare Workload控制组。
1
|
CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High"); |
创建资源池pool_p,设定复杂语句执行的最大并发数量为5,内存使用比例50%,网络权重为5。
1
|
CREATE RESOURCE POOL pool_p WITH (ACTIVE_STATEMENTS=5, MEM_PERCENT=50, weight=5); |
可通过PG_RESOURCE_POOL系统表查询资源池的配置参数。
1
|
SELECT * FROM PG_RESOURCE_POOL WHERE respool_name = 'pool_p'; |

1 2 |
CREATE EXCEPT RULE except_rule4 WITH (elapsedtime=10); CREATE resource pool resource_pool_a4 WITH (except_rule='except_rule4'); |
创建一个资源池,并打开该资源池的弹性并发扩展功能。
1
|
CREATE RESOURCE POOL pool6 WITH (enable_concurrency_scaling=true); |
示例:创建异常规则,当作业执行时间超过10秒,则终止该作业
在DWS资源负载管理中,异常规则需要绑定到资源池后生效,紧接着将执行作业的用户绑定到指定资源池后,总体上才能达到资源负载管理的效果,当用户执行某作业时,若触发异常规则,则作业将被终止,以下示例模拟了这一终止过程。
- 先创建一个测试表并导入数据。
- 以系统管理员连接数据库执行以下SQL,创建一个名为src的临时表,为后续的INSERT操作提供数据源。
1 2
CREATE SCHEMA test; CREATE TABLE test.src AS SELECT 1;
- 执行以下SQL,创建表test.test。
1 2
DROP TABLE IF EXISTS test.test; CREATE TABLE test.test(a int, b numeric(15,2)) WITH(orientation=column);
- 执行以下SQL,分别为两张表插入2000万行数据。执行时间约半分钟,请等待。
1INSERT INTO test.test SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM test.src;
- 以系统管理员连接数据库执行以下SQL,创建一个名为src的临时表,为后续的INSERT操作提供数据源。
- 创建一个异常规则集except_rule4,设置执行的最大时间elapsedtime为10秒
1CREATE EXCEPT RULE except_rule4 WITH (elapsedtime=10);
- 创建一个资源池resource_pool_a4,并将异常规则绑定到该资源池。
1CREATE resource pool resource_pool_a4 WITH (except_rule='except_rule4');
- 创建一个作业用户,并绑定到资源池resource_pool_a4中,密码请用户自定义。
1CREATE USER user4 RESOURCE POOL 'resource_pool_a4' PASSWORD 'password';
- 授权作业用户user4可以访问表test.test。
1 2
GRANT USAGE ON SCHEMA test TO user4; GRANT SELECT ON TABLE test.test TO user4;
- 以作业用户user4连接数据库,执行以下SQL,超过10秒,语句被终止了。
1SELECT * FROM test.test;

- 通过PG_EXCEPT_RULE系统表,可以查看异常规则定义。
1SELECT * FROM PG_EXCEPT_RULE WHERE name = 'except_rule4';
