
# query_band负载识别
#### 概述
DWS实现基于query_band的负载识别和队列内优先级控制，一方面提供了更为灵活的负载识别手段，可根据作业类型、应用名称、脚本名称等识别负载队列，使用户根据业务场景可灵活配置query_band识别队列；另一方面实现了队列内作业下发优先级控制，后续将逐步实现队列内资源优先级控制。
管理员用户可根据业务场景及作业类别配置query_band所关联队列及估算内存限制等实现更为灵活的负载控制与资源管控。如果业务未配置query_band或用户未将query_band关联行为时，作业会默认使用用户关联队列和队列内优先级。
#### query_band支持的负载行为
query_band是一个session级别的GUC参数，作为作业标识符，本身没有特殊含义，数据类型为字符型，支持赋值任何字符串。但是为方便区分和设置，query_band负载识别仅支持识别键值对形式的query_band，示例：
```
SET query_band='JobName=abc;AppName=test;UserName=user';
```
其中，'JobName=abc'、'AppName=test'以及'UserName=user'都是一个独立的键值对。query_band键值对规格：
- query_band使用键值对方式设置，即'key=value'；session内支持设置多个query_band键值对，多个键值对之间使用分号分隔。query_band键值对和query_band参数值长度的上限均为1024个字符。
- query_band键值对支持的有效字符包括：数字0\~9、大写字母A\~Z、小写字母a-z、'.'、'-'、'_' 以及'#'。 
  
query_band负载识别以键值对为单位设置和识别负载行为，目前支持的负载行为，如[表1]所示：
 表1QUERY_BAND支持负载行为 
| 类别             | 行为                                                                                                        | 行为表现            |
|:---|:---|:---|
| 负载管理(workload) | 资源池(respool)                                                                                              | query_band关联资源池 |
| 负载管理(workload) | 优先级(priority)                                                                                             | 队列内优先级          |
| 次序(order)      | 队列（respool） 目前为无效字段，主要用于后续扩展。 | query_band搜索次序  |
   
其中，行为类别用于负载行为归类，不同的负载行为可能属于同一个类别，比如资源池和优先级同属于负载管理类别；负载行为代表query_band键值对关联的是哪种负载行为；行为表现用于记录具体的负载行为是什么；负载类别中的次序用于标记query_band负载行为识别的优先级，一个session内设置多个query_band键值对时，优先使用次序较小的query_band键值对识别负载行为。每一个query_band键值对都可以对应0个或多个负载行为，但是一种负载行为只能关联一个。query_band负载行为详细说明如下：
- 资源池：query_band支持关联资源池，作业执行时，若query_band指定了资源池，则使用query_band关联的资源池，否则使用用户关联的资源池。
  - query_band关联资源池时，资源池不存在报错退出，关联失败。
  
  - query_band关联资源池时，记录query_band与资源池依赖关系。
  
  - query_band关联资源池删除时，提示有query_band依赖，资源池删除失败。
   
- 队列内优先级：query_band支持关联作业优先级，支持高中低(High/Medium/Low)三个优先级，同时提供Rush作为特殊优先级（绿色通道），默认优先级为Medium。正常实践过程中，大部分作业使用Medium优先级，优先级较低作业使用Low优先级，特权作业使用High优先级，High作业不建议过多。Rush优先级作为特殊场景下应急使用，平时不建议使用。 队列内优先级实现队列内排队优先级：
  - 静态负载管理场景下，CN并发不足时，触发CN全局队列排队，CN全局队列为优先级队列。
  
  - 动态负载管理场景下，DN内存不足时，触发CCN全局排队，CCN全局队列为优先级队列。
  
  - 资源池并发或内存不足时，触发资源池排队，资源池队列为优先级队列。
  
  
  以上优先级队列均遵守以下调度规则：
  - 优先级高作业优先调度。
  
  - 优先级高作业全部调度完之后调度优先级低作业。
  
  - 动态负载管理场景下，CN全局队列不支持query_band优先级。
   
- 次序：支持设置query_band识别次序，未设置识别次序的使用默认次序-1。除默认次序外，不存在次序相同的两个query_band。设置次序时对query_band次序进行校验，存在相同次序时，已存在次序递归+1直到不存在相同次序为止。
  - session内设置多个query_band键值对时，使用次序较小的query_band键值对作为负载识别的query_band。
  
  - 次序最小为0，默认次序-1为最大次序。
  
  - 次序都为默认次序时，使用设置靠前的query_band作为负载识别的query_band。
  
  - 示例：set query_band='b=1;a=3;c=1'; b=1，其中b=1次序-1，a=3次序4，c=1次序1，则使用c=1作为负载识别的query_band，此设计可提供负载管理员对负载调度调整能力。
   
 
#### query_band应用与配置
- pg_workload_action跨库系统表用于存储query_band行为和次序，详见[PG_WORKLOAD_ACTION](https://support.huaweicloud.com/devg-dws/dws_04_0632.html)。
- 默认行为和次序在系统表pg_workload_action不存储，query_band有设置非默认行为的，查询其行为默认行为也显示；查询行为和次序都为默认的query_band行为时，显示\<query_band information not found\>。
- gs_wlm_set_queryband_action函数用于设置query_band行为：其中第一个参数即queryband键值对的长度上限为63个字符；第二个参数action不区分大小写，多个action使用分号分隔；order为缺省参数，默认为-1。具体请参见[gs_wlm_set_queryband_action](https://support.huaweicloud.com/sqlreference-dws/dws_06_0063.html)。
- gs_wlm_set_queryband_order函数设置query_band次序：其中第一个参数即queryband键值对的长度上限为63个字符；query_band次序必须大于等于-1，除默认次序-1外不存在两个次序相同的query_band。设置query_band次序时如果存在相同次序的query_band，则将原query_band次序+1。具体请参见[gs_wlm_set_queryband_order](https://support.huaweicloud.com/sqlreference-dws/dws_06_0063.html)。
- gs_wlm_get_queryband_action函数用于查询query_band行为，具体请参见[gs_wlm_set_queryband_action](https://support.huaweicloud.com/sqlreference-dws/dws_06_0063.html)。
- pg_queryband_action系统视图用于查询所有query_band行为，具体请参见[PG_QUERYBAND_ACTION](https://support.huaweicloud.com/devg-dws/dws_04_0743.html)。
- query_band优先级在负载管理视图（[PG_SESSION_WLMSTAT](https://support.huaweicloud.com/devg-dws/dws_04_0749.html)）中显示为int型，数字和优先级的对应关系如下：
  - 0：表示该作业不受负载管理管控；
  
  - 1：LOW；
  
  - 2：MEDIUM；
  
  - 4：HIGH；
  
  - 8：RUSH；
   
- 权限控制：除初始用户外，被授权用户才具有设置和查询query_band权限。
 
![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
- 批量取消所有运行作业或队列并发上限是1且只有一个队列有作业运行的情况下，可能会触发CN自动唤醒作业导致作业不按照优先级下发。
 
#### 示例
1. 设置query_band"JobName=abc"关联资源池p1、队列内优先级Rush、次序为1。 
   ```
   SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','respool=p1;priority=rush',1);
   gs_wlm_set_queryband_action
   -----------------------------
    t
   (1 row)
   ```
   
   
2. 修改query_band"JobName=abc"的关联资源池为p2。 
   ```
   SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','respool=p2');
   gs_wlm_set_queryband_action
   -----------------------------
    t
   (1 row)
   ```
   
   
3. 修改query_band"JobName=abc"的队列内优先级为High。 
   ```
   SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','priority=high');
   gs_wlm_set_queryband_action
   -----------------------------
    t
   (1 row)
   ```
   
   
4. 修改query_band"JobName=abc"的次序为3。 
   ```
   SELECT * FROM gs_wlm_set_queryband_order('JobName=abc',3);
   gs_wlm_set_queryband_order
   -----------------------------
    t
   (1 row)
   ```
   
   
5. 查询query_band关联的负载行为。 
   ```
   SELECT * FROM pg_queryband_action;
       qband     | respool_id | respool | priority | qborder
   --------------+------------+---------+----------+---------
    JobName=abc  |      17119 | p2      | high     |       1
   (1 row)
   ```
   
   
6. 设置query_band"AppName=test"队列内优先级Low，使用用户关联资源池，同时使用默认次序。 
   ```
   SELECT * FROM gs_wlm_set_queryband_action('AppName=test','priority=low');
   gs_wlm_set_queryband_action
   -----------------------------
    t
   (1 row)
   ```
   
   
7. 查询query_band关联的负载行为。 
   ```
   SELECT * FROM pg_queryband_action;
       qband     | respool_id | respool | priority | qborder
   --------------+------------+---------+----------+---------
    AppName=test |          0 | NULL    | low      |      -1
    JobName=abc  |      16754 | p2      | high     |       3
   (2 rows)
   ```
   
   
8. 取消query_band"JobName=abc"关联的所有负载行为，设置为默认行为即可。 
   ```
   SELECT * FROM gs_wlm_set_queryband_action('JobName=abc','respool=null;priority=medium',-1);
   NOTICE:  The respool of query_band(JobName=abc) will be removed.
   NOTICE:  The priority of query_band(JobName=abc) will be removed.
    gs_wlm_set_queryband_action
   -----------------------------
    t
   (1 row)
   ```
   
   
9. 查询query_band关联的负载行为。 
   ```
   SELECT * FROM pg_queryband_action;
       qband     | respool_id | respool | priority | qborder
   --------------+------------+---------+----------+---------
    AppName=test |          0 | NULL    | low      |      -1
   (1 row)
   ```
   
   
 
