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;