更新时间:2025-11-03 GMT+08:00

CREATE RESOURCE POOL

功能描述

创建一个资源池,并指定此资源池相关联的控制组。数据库的系统资源(CPU资源、内存资源、IO资源和存储资源)是有限的,DWS在同时运行多种类型的业务(如数据加载、批量分析、实时查询等)时,各类型业务之间可能会竞争资源,从而出现资源性能瓶颈,导致吞吐量下降,造成整体性能低下。那么对系统的资源进行合理的分配,能避免产生资源不合理利用而导致的系统运行效率下降等问题,因此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}[, ... ])];

参数说明

表1 CREATE RESOURCE POOL参数说明

参数

描述

取值范围或示例

pool_name

资源池名称。

资源池名称不能和当前数据库里已有的资源池重名。

字符串,需符合标识符命名规范

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控制组。

1
CREATE RESOURCE POOL pool1;

创建一个资源池,其控制组指定为“DefaultClass”组下属的“High”Timeshare Workload控制组。

1
CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High");

ACTIVE_STATEMENTS

资源池复杂语句执行的最大并发数量。数值型,-1~INT_MAX,不指定时,默认是10。

创建资源池pool3,设定复杂语句执行的最大并发数量为5,内存使用比例50%,网络权重为5。

1
CREATE RESOURCE POOL pool3 WITH (ACTIVE_STATEMENTS=5, MEM_PERCENT=50, weight=5);

MAX_DOP

资源池简单语句执行的最大并发数量。数值型,-1~INT_MAX,-1和0代表不限制,不指定时,默认为-1,不限制。

创建资源池pool4,设定简单语句执行最大并发数量为10。

1
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

示例:创建异常规则,当作业执行时间超过10秒,则终止该作业

weight

资源池网络带宽权重。取值范围为-1~2147483647的整数,默认配置为-1,不设置权重。

-

enable_concurrency_scaling

弹性并发扩展功能开关。该功能仅9.1.0.100及以上集群版本支持。

  • true表示开启该资源池作业的弹性并发扩展功能。
  • false表示关闭该资源池作业的弹性并发扩展功能。

默认值: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';

创建一个异常规则集except_rule4,设置执行的最大时间elapsedtime为10秒,并创建一个资源池同时绑定异常规则。
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资源负载管理中,异常规则需要绑定到资源池后生效,紧接着将执行作业的用户绑定到指定资源池后,总体上才能达到资源负载管理的效果,当用户执行某作业时,若触发异常规则,则作业将被终止,以下示例模拟了这一终止过程。

  1. 先创建一个测试表并导入数据。

    1. 以系统管理员连接数据库执行以下SQL,创建一个名为src的临时表,为后续的INSERT操作提供数据源。
      1
      2
      CREATE SCHEMA test;
      CREATE TABLE test.src AS SELECT 1;
      
    2. 执行以下SQL,创建表test.test。
      1
      2
      DROP TABLE IF EXISTS test.test;
      CREATE TABLE test.test(a int, b numeric(15,2)) WITH(orientation=column);
      
    3. 执行以下SQL,分别为两张表插入2000万行数据。执行时间约半分钟,请等待。
      1
      INSERT INTO test.test SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM test.src;
      

  2. 创建一个异常规则集except_rule4,设置执行的最大时间elapsedtime为10秒

    1
    CREATE EXCEPT RULE except_rule4 WITH (elapsedtime=10);
    

  3. 创建一个资源池resource_pool_a4,并将异常规则绑定到该资源池。

    1
    CREATE resource pool resource_pool_a4 WITH (except_rule='except_rule4');
    

  4. 创建一个作业用户,并绑定到资源池resource_pool_a4中,密码请用户自定义。

    1
    CREATE USER user4 RESOURCE POOL 'resource_pool_a4' PASSWORD 'password';
    

  5. 授权作业用户user4可以访问表test.test。

    1
    2
    GRANT USAGE ON SCHEMA test TO user4;
    GRANT SELECT ON TABLE test.test TO user4;
    

  6. 以作业用户user4连接数据库,执行以下SQL,超过10秒,语句被终止了。

    1
    SELECT * FROM test.test;
    

  7. 通过PG_EXCEPT_RULE系统表,可以查看异常规则定义。

    1
    SELECT * FROM PG_EXCEPT_RULE WHERE name = 'except_rule4';