greenplum資源隊列
- 2019 年 12 月 5 日
- 筆記
greenplum資源隊列
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' ]
參數:
name
資源隊列的名字。
ACTIVE_STATEMENTS integer
帶有 ACTIVE_STATEMENTS 閥值的資源隊列限制了分配到隊列角色所能夠執行的查詢的數量。它(閥值)控制着活躍查詢的數量,活躍查詢是在同一時間允許運行的查詢數量。ACTIVE_STATEMENTS 的值應該是一個大於0的整數值。
MEMORY_LIMIT 'memory_units'
對於所有從該資源隊列中提交的語句設置總內存配額。內存單元可以指定為kB, MB或者GB。對於一個資源隊列來說最小的內存配額是10MB, 沒有最大限值,但是查詢執行的上邊界由Segment主機的物理內存所限定。默認值時沒有限制為(-1)。
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 ,超過成本限制的查詢將始終被拒絕,從不允許運行。
MIN_COST float
該是最小查詢的最小查詢成本限制。成本低於此限制的查詢將不會排隊等待立即運行。成本由Greenplum數據庫查詢優化器(正如查詢 EXPLAIN 輸出所示)確定的查詢的估計總成本所衡量。 因此,管理員必須熟悉通常在系統上執行的查詢,以便為被認為是小型查詢設置適當的成本。 成本是以磁盤頁提取為單位來衡量的; 1.0等於一個順序的磁盤頁面讀取。MIN_COST 的值可以被指定為浮點數(例如 100.0)或也可以被指定為一個指數(例如 1e+2)。
PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX}
設置和資源隊列相關查詢的優先級。隊里中擁有高優先級的查詢和語句會在競爭中擁有更大的可用CPU資源份額。隊列中擁有低優先級的查詢將會被推遲,同時,更高優先級的查詢將會被執行。如果沒有指定優先級,和隊列相關的查詢的優先級為 MEDIUM。
注意:
1、官方建議使用MEMORY_LIMIT 和ACTIVE_STATEMENTS 來替代max_cost
2、如果隊列中未設置MEMORY_LIMIT,則每個查詢可用的內存值為系統參數statement_mem的值,最大可用內存為statement_mem /ACTIVE_STATEMENTS
3、並不是所有語句都受資源隊列限制,默認情況下,只有SELECT, SELECT INTO, CREATE TABLE AS SELECT, 和DECLARE CURSOR受限,如果配置參數resource_select_only = off,則INSERT, UPDATE,DELETE語句也會受限
4、如果沒有設置max_cost,那麼每個語句使用的內存是MEMORY_LIMIT/ACTIVE_STATEMENTS,如果設置了max_cost,內存是MEMORY_LIMIT*(query_cost/max_cost),query_cost為實際SQL的cost
2、創建資源隊列
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);
3、修改變更資源隊列
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);
4、刪除資源隊列
要刪除一個資源隊列,該隊列不能與任何ROLE相關。
使用DROP RESOURCE QUEUE命令刪除資源隊列。
=# DROP RESOURCE QUEUE q_hank;
5、添加用戶到資源隊列中
a) 賦予role資源管理隊列
alter role hank resource queue q_hank;
b) 恢復到使用默認的資源隊列
ALTER ROLE hank RESOURCE QUEUE none;
6、資源隊列的相關查詢語句
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, 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;