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' ]數據庫
name
資源隊列的名字。post
ACTIVE_STATEMENTS integer
帶有 ACTIVE_STATEMENTS 閥值的資源隊列限制了分配到隊列角色所可以執行的查詢的數量。它(閥值)控制着活躍查詢的數量,活躍查詢是在同一時間容許運行的查詢數量。ACTIVE_STATEMENTS 的值應該是一個大於0的整數值。優化
MEMORY_LIMIT 'memory_units'
對於全部從該資源隊列中提交的語句設置總內存配額。內存單元能夠指定爲kB, MB或者GB。對於一個資源隊列來講最小的內存配額是10MB, 沒有最大限值,可是查詢執行的上邊界由Segment主機的物理內存所限定。默認值時沒有限制爲(-1)。rest
MAX_COST float
帶有MAX_COST 閥值的資源隊列對查詢代價設置了一個最大限制。該查詢可以被分配到該隊列的用戶所執行。代價由Greenplum數據庫查詢優化器(正如查詢EXPLAIN 輸出顯示的)肯定的查詢的 估計共代價 進行衡量的。 所以,管理員必需要熟悉在系統中執行的典型查詢,以對隊列設置一個合理的閥值。成本以磁盤頁提取爲單位進行衡量;1.0 等於順序讀取一個磁盤頁。MAX_COST 的值能夠被指定爲浮點數(例如 100.0) 或者能夠被指定爲(例如 1e+2)。隊列
COST_OVERCOMMIT boolean
若是基於 MAX_COST限制資源隊列,則管理員能夠容許 COST_OVERCOMMIT(默認)。這意味着超過容許的成本閾值的查詢將被容許運行,但只有在系統空閒時才能運行。若是指定 COST_OVERCOMMIT=FALSE ,超過成本限制的查詢將始終被拒絕,從不容許運行。ip
MIN_COST float
該是最小查詢的最小查詢成本限制。成本低於此限制的查詢將不會排隊等待當即運行。成本由Greenplum數據庫查詢優化器(正如查詢 EXPLAIN 輸出所示)肯定的查詢的估計總成本所衡量。 所以,管理員必須熟悉一般在系統上執行的查詢,以便爲被認爲是小型查詢設置適當的成本。 成本是以磁盤頁提取爲單位來衡量的; 1.0等於一個順序的磁盤頁面讀取。MIN_COST 的值能夠被指定爲浮點數(例如 100.0)或也能夠被指定爲一個指數(例如 1e+2)。內存
PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX}
設置和資源隊列相關查詢的優先級。隊裏中擁有高優先級的查詢和語句會在競爭中擁有更大的可用CPU資源份額。隊列中擁有低優先級的查詢將會被推遲,同時,更高優先級的查詢將會被執行。若是沒有指定優先級,和隊列相關的查詢的優先級爲 MEDIUM。資源
一、官方建議使用MEMORY_LIMIT 和ACTIVE_STATEMENTS 來替代max_costit
二、若是隊列中未設置MEMORY_LIMIT,則每一個查詢可用的內存值爲系統參數statement_mem的值,最大可用內存爲statement_mem /ACTIVE_STATEMENTSio
三、並非全部語句都受資源隊列限制,默認狀況下,只有SELECT, SELECT INTO, CREATE TABLE AS SELECT, 和DECLARE CURSOR受限,若是配置參數resource_select_only = off,則INSERT, UPDATE,DELETE語句也會受限
四、若是沒有設置max_cost,那麼每一個語句使用的內存是MEMORY_LIMIT/ACTIVE_STATEMENTS,若是設置了max_cost,內存是MEMORY_LIMIT*(query_cost/max_cost),query_cost爲實際SQL的cost
create resource queue prod_queue with (ACTIVE_STATEMENTS=100,MEMORY_LIMIT='12800MB',priority=high);
create resource queue q_hank with (ACTIVE_STATEMENTS=10,MEMORY_LIMIT='200MB',PRIORITY=HIGH,COST_OVERCOMMIT=true,MIN_COST=100,MAX_COST=1000000);
a) 使用ALTER RESOURCE QUEUE命令來改變資源隊列的限制
=# ALTER RESOURCE QUEUE q_hank WITH (ACTIVE_STATEMENTS=3);
=# ALTER RESOURCE QUEUE q_hank WITH (MAX_COST=100000.0);
b) 將活動語句數量或者內存限制重置爲無限制,可使用-1值。
=# ALTER RESOURCE QUEUE q_hank WITH (MAX_COST=-1.0, MEMORY_LIMIT=‘2GB’);
c) 改變查詢優先級
=# ALTER RESOURCE QUEUE q_hank WITH (PRIORITY=MIN);
要刪除一個資源隊列,該隊列不能與任何ROLE相關。
使用DROP RESOURCE QUEUE命令刪除資源隊列。
=# DROP RESOURCE QUEUE q_hank;
a) 賦予role資源管理隊列
alter role hank resource queue q_hank;
b) 恢復到使用默認的資源隊列
ALTER ROLE hank RESOURCE QUEUE none;
a) 經過如下視圖能夠查看到參數內容
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
b) 查看資源隊列相關使用狀況:
SELECT * FROM gp_toolkit.gp_resqueue_status;
c) 查看資源隊列統計信息:
SELECT * FROM pg_stat_resqueues;
d) 查詢角色分配的資源隊列:
SELECT * from gp_toolkit.gp_resq_role;
e) 查詢資源隊列中的等待查詢:
SELECT * FROM gp_toolkit.gp_locks_on_resqueue WHERE lorwaiting='true';
f) 查詢活動語句的優先級
select * from gp_toolkit.gp_resq_priority_statement;
g) 清理資源隊列中等待的查詢:SELECT rolname, rsqname, pid, granted,current_query, datnameFROM pg_roles, gp_toolkit.gp_resqueue_status, pg_locks,pg_stat_activityWHERE pg_roles.rolresqueue=pg_locks.objidAND pg_locks.objid=gp_toolkit.gp_resqueue_status.queueidAND pg_stat_activity.procpid=pg_locks.pidAND pg_stat_activity.usename=pg_roles.rolname;