Greenplum Resource Queue (资源队列)

在4.x版本后,加入了资源队列的概念,资源队列是为了限制资源的消耗,更加合理的分配资源


主要可以限制的资源如下:
1.MEMORY_LIMIT 内存限制
2.ACTIVE_STATEMENTS 最多并发运行的SQL
3.PRIORITY  优先级,和CPU相关
4.MAX_COST  执行计划中SQL语句可以达到最大的COST
5.MIN_COST  低于这个值则绕过队列限制,立即执行
相关参数
resource_select_only参数和如果是off,那么insert,update,delete也将被资源队列限制,如果是on,那么只有select,select into,create table as select ,declare cursor被资源队列限制
max_resource_queues  资源队列最大个数
max_resource_portals_per_transaction 能打开最多多少游标
resource_cleanup_gangs_on_wait 开启查询前是否清理队列中的空闲进程
stats_queue_level 是否搜集资源队列统计信息


1.创建资源队列
语法:
Command:     CREATE RESOURCE QUEUE
Description: create a new resource queue for workload management
Syntax:
CREATE RESOURCE QUEUE name WITH (queue_attribute=value [, ... ]) 
where queue_attribute is:
   ACTIVE_STATEMENTS=integer
        [ MAX_COST=float [COST_OVERCOMMIT={TRUE|FALSE}] ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]
|  MAX_COST=float [ COST_OVERCOMMIT={TRUE|FALSE} ] 
        [ ACTIVE_STATEMENTS=integer ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]


实例:
create resource queue q_hank with 
(ACTIVE_STATEMENTS=10,MEMORY_LIMIT='200MB',PRIORITY=HIGH,COST_OVERCOMMIT=true,MIN_COST=100,MAX_COST=1000000);
赋予role资源管理队列
alter role hank resource queue q_hank;
恢复到使用默认的资源队列,pg_default
ALTER ROLE hank RESOURCE QUEUE none; 
创建后,通过以下视图可以查看到参数内容
postgres=# select * from pg_resqueue_attributes ;
  rsqname   |      resname      | ressetting | restypid 
------------+-------------------+------------+----------
 pg_default | active_statements | 20         |        1
 pg_default | max_cost          | -1         |        2
 pg_default | min_cost          | 0          |        3
 pg_default | cost_overcommit   | 0          |        4
 pg_default | priority          | medium     |        5
 pg_default | memory_limit      | -1         |        6
 q_hank     | active_statements | 10         |        1
 q_hank     | max_cost          | 1e+06      |        2
 q_hank     | min_cost          | 100        |        3
 q_hank     | cost_overcommit   | 1          |        4
 q_hank     | priority          | high       |        5
 q_hank     | memory_limit      | 200MB      |        6


 这里解释以下参数,如果没有设置max_cost,那么每个语句使用的内存是MEMORY_LIMIT/ACTIVE_STATEMENTS,如果设置了max_cost,内存是MEMORY_LIMIT*(query_cost/max_cost),query_cost为实际SQL的cost
 如果要临时执行比较消耗内存的SQL,可以修改statement_mem参数,如下:
 set statement_mem='1GB';
 执行语句
 reset statement_mem;
另外COST_OVERCOMMIT参数为false,只要SQL超过MAX_COST就会报错,如果为true,在当前资源队列中,没有其他sql运行的时候,超过MAX_COST也会被执行




查看资源队列相关使用情况:
SELECT * FROM gp_toolkit.gp_resqueue_status;  #查看资源队列状态
查询角色分配的资源队列:
SELECT rolname, rsqname FROM pg_roles, 
gp_toolkit.gp_resqueue_status 
WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid;
查询资源队列中的等待查询:
SELECT * FROM gp_toolkit.gp_locks_on_resqueue WHERE lorwaiting='true';
清理资源队列中等待的查询:
SELECT rolname, rsqname, pid, granted,current_query, datname 
FROM pg_roles, gp_toolkit.gp_resqueue_status, pg_locks,pg_stat_activity 
WHERE pg_roles.rolresqueue=pg_locks.objid 
AND pg_locks.objid=gp_toolkit.gp_resqueue_status.queueid
AND pg_stat_activity.procpid=pg_locks.pid;
AND pg_stat_activity.usename=pg_roles.rolname;
查出等待查询的pid,然后杀死该pid
pg_cancel_backend(xxxx)
查询活动语句的优先级
select * from gp_toolkit.gp_resq_priority_statement;
重设活动语句的优先级:
gp_adjust_priority(session_id, statement_count, priority)
这个函数值对当前修改的活动语句有效,同一资源队列后面执行的语句还是使用其预先设定的优先级
例子:
select * from gp_toolkit.gp_resq_priority_statement;
 rqpdatname | rqpusename | rqpsession | rqpcommand | rqppriority | rqpweight |                       rqpquery                       
------------+------------+------------+------------+-------------+-----------+------------------------------------------------------
 warehouse  | balance    |      16645 |        978 | HIGH        |      1000 | delete from balance.sps_mm_base \r                   
select gp_adjust_priority(16645,978,'MIN');




rqpsession=session_id
rqpcommand=statement_count
MAX, HIGH, MEDIUM, or LOW = priority
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值