gp的资源管理队列


gp可以通过resource queue来限制用户使用系统的资源,gp是通过用户可以执行并发的sql数量、每个sql的cost、sql的优先级来限制用户对gp资源的使用。
一般,系统根据公司对gp的使用情况分为:
系统报表计算:为业务系统计算报表,需要特殊保证的,不会阻塞影响,优先级居中
bi个性化分析:为做个性化计算分析准备,属于内部使用,优先级可以最低
管理员权限:可以使用所有权限,优先级最高
--=================================================================
创建资源队列adhoc限定最大活动语句数为10,这意味着超过10个就会等待,
CREATE RESOURCE QUEUE adhoc1 WITH (ACTIVE_STATEMENTS=8);
CREATE RESOURCE QUEUE adhoc2 WITH (ACTIVE_STATEMENTS=8);
CREATE RESOURCE QUEUE adhoc3 WITH (ACTIVE_STATEMENTS=10);


更改资源管理队列(resource queue)              
alter resource queue adhoc3 with(active_statements=10);


修改资源队列的优先级为
PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX}


ALTER RESOURCE QUEUE adhoc1 WITH (PRIORITY=HIGH);
ALTER RESOURCE QUEUE adhoc2 WITH (PRIORITY=MEDIUM);
ALTER RESOURCE QUEUE adhoc3 WITH (PRIORITY=LOW);




分配ROLE(User)到资源队列:把resource queue分配给用户 
ALTER ROLE xxx RESOURCE QUEUE adhoc1;


限制sql的cost的阀值为10000.0
gptest=# create resource queue adhoc1 with(max_cost=10000.0);
CREATE QUEUE


限制并发sql的数量为2,sql的cost小于100.0的可以不受限制
gptest=# create resource queue adhoc2 with(active_statements=2,min_cost=100.0);
CREATE QUEUE
 
设置优先级为max 
gptest=# create resource queue adhoc3 with(active_statements=2,min_cost=100.0,priority=max);
CREATE QUEUE
gptest=#


gptest=# create role skate1 with login resource queue adhoc;
CREATE ROLE
gptest=#


把用户的resource queue恢复系统默认的pg_default
gptest=# alter role skate resource queue none;
NOTICE:  resource queue required -- using default resource queue "pg_default"
ALTER ROLE
gptest=#


删除resource queue,但队列必须没有被任何role使用
gptest=# drop resource queue adhoc;
ERROR:  resource queue "adhoc" is used by at least one role
gptest=#


如果要限定其最大连接数,则可以使用
CREATE ROLE marketor WITH CONNECTION LIMIT connlimit


--===========================================================
查看resource queue的状态:
select * from pg_resqueue_status;

查看role分配的resource queue
SELECT rolname, rsqname FROM pg_roles, pg_resqueue WHERE pg_roles.rolresqueue=pg_resqueue.oid;
 
 
查询所有的resource queue的当前活动sql 
 SELECT usename, rsqname, locktype, objid, transaction,
 pid, mode, granted, waiting
 FROM pg_stat_activity, pg_resqueue, pg_locks
 WHERE pg_stat_activity.procpid=pg_locks.pid
 AND pg_locks.objid=pg_resqueue.oid;
 
清空等待的sql 
 SELECT rolname, rsqname, pid, granted,
 current_query, datname
 FROM pg_roles, pg_resqueue, pg_locks, pg_stat_activity
 WHERE pg_roles.rolresqueue=pg_locks.objid
 AND pg_locks.objid=pg_resqueue.oid
 AND pg_stat_activity.procpid=pg_locks.pid;
 
查到pid后,直接kill即可。为了简单,可以为sql创建视图,如下:
 create view resource_proc as SELECT rolname, rsqname, pid, granted,
 current_query, datname
 FROM pg_roles, pg_resqueue, pg_locks, pg_stat_activity
 WHERE pg_roles.rolresqueue=pg_locks.objid
 AND pg_locks.objid=pg_resqueue.oid
 AND pg_stat_activity.procpid=pg_locks.pid;
 

版权声明:本文为rgb_rgb原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。