为了更细致地控制查询并发数,云原生数据仓库 AnalyticDB MySQL 版的Interactive型资源组提供了优先级队列的能力。每个资源组都有自己的一组优先级队列,包括LOWEST队列、LOW队列、NORMAL队列和HIGH队列。您可以设置查询的优先级,使不同查询进入不同的优先级队列,并通过修改队列并发数来对查询进行限流或放大并发。本文介绍如何设置查询的优先级,以及如何设置队列的并发数。
前提条件
集群的内核版本为3.1.6.3及以上版本。
查看湖仓版集群的内核版本,请执行
SELECT adb_version();
。如需升级内核版本,请联系技术支持。查看和升级数仓版集群的内核版本,请参见查看和升级版本。
功能概述
查询优先级
每个Interactive型资源组都有一组查询优先级队列。一组查询优先级队列包含四个队列,分别为LOWEST队列、LOW队列、NORMAL队列和HIGH队列。默认情况下,普通SELECT查询进入NORMAL队列,其他ETL查询(例如INSERT INTO SELECT
、DELETE SELECT
、INSERT OVERWRITE SELECT
),会进入LOWEST队列。您可以设置查询的优先级,使不同查询进入不同的优先级队列。同一优先级队列中,优先级取值高的查询会优先执行,例如query_priority=8的查询会比query_priority=6的查询优先执行。
各队列的优先级范围如图所示。
队列并发
每个查询优先级队列都可设置最大可运行查询数和最大排队查询数。
当查询优先级队列里正在执行的查询数量≥最大可运行查询数时,新的查询将进入排队状态。
当查询优先级队列里排队状态的查询数量≥最大可排队查询数+最大可运行查询数时,新的查询将直接被拒绝。
当正在执行的查询结束时,如果有排队状态的查询,优先级高的查询优先执行,同优先级查询以FIFO方式执行(先进入排队状态的查询先执行)。
开启查询优先级
内核版本为3.1.8.2及以上版本,默认开启查询优先级。
内核版本为3.1.6.3~3.1.8.2(不包含3.1.8.2)版本,需执行下方语句,手动开启查询优先级。
SET ADB_CONFIG XIHE_ENV_QUERY_PRIORITY_QUEUE_ENABLE=true;
设置查询优先级
ETL查询的默认优先级为LOWEST(对应取值为5),普通查询(SELECT)的默认优先级为NORMAL(对应取值为25)。如果需要提高或降低查询的优先级,可参考下文设置查询的优先级。
注意事项
INSERT INTO ... VALUES(...)
语句不支持设置查询优先级。
设置方法
(推荐)通过Workload Manager自动添加HINT。详细信息,请参见查询优先级。
在查询语句前,添加以下HINT,配置查询优先级。
/*+ query_priority=<优先级取值>*/ select_statement
优先级取值:取值可以为整数,范围为0~39。数值越大,优先级越高。取值也可以为字符串,包括LOWEST、LOW、NORMAL、HIGH,分别对应的整数为5、15、25、35。
示例
设置优先级为HIGH,使查询进入HIGH队列。
/*+ query_priority=HIGH*/ SELECT * FROM test_table;
设置优先级为35,使查询进入HIGH队列。
/*+ query_priority=35*/ SELECT * FROM test_table;
设置队列并发
Interactive型资源组支持设置优先级队列的查询并发数和最大排队数。优先级队列的并发设置分为全局设置和单个资源组设置。
设置方法
设置全局的优先级队列并发:
SET ADB_CONFIG <并发参数> = <取值>
。设置单个资源组的优先级队列并发:
SET ADB_CONFIG <资源组名称>.<并发参数> = <取值>
。
数仓版预留模式不支持设置单个资源组的优先级队列并发。
并发参数列表
查询优先级队列的参数取值代表单个前端节点的队列大小,不是集群的队列总大小。集群的队列总大小等于单个队列乘以前端节点个数,即集群的队列总大小=单个队列×前端节点个数。
查询优先级队列的参数配置对全局前端节点同时生效。
前端节点即FrontNode,更多详细信息,请参见接入层高可用。
队列名 | 配置参数 | 默认值 | 说明(对单个资源组) |
LOWEST(ETL) 队列 | XIHE_ENV_QUERY_ETL_MAX_CONCURRENT_SIZE | 20 | 单个前端节点LOWEST队列的最大可运行查询数为20。 |
XIHE_ENV_QUERY_ETL_MAX_QUEUED_SIZE | 200 | 单个前端节点LOWEST队列的最大可排队查询数为200。 | |
LOW队列 | XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE | 20 | 单个前端节点LOW队列的最大可运行查询数为20。 |
XIHE_ENV_QUERY_LOW_PRIORITY_MAX_QUEUED_SIZE | 200 | 单个前端节点LOW队列的最大可排队查询数为200。 | |
NORMAL队列 | XIHE_ENV_QUERY_NORMAL_MAX_CONCURRENT_SIZE | 20 | 单个前端节点NORMAL队列的最大可运行查询数为20。 |
XIHE_ENV_QUERY_NORMAL_MAX_QUEUED_SIZE | 200 | 单个前端节点NORMAL队列的最大可排队查询数为200。 | |
HIGH队列 | XIHE_ENV_QUERY_HIGH_MAX_CONCURRENT_SIZE | 40 | 单个前端节点HIGH队列的最大可运行查询数为40。 |
XIHE_ENV_QUERY_HIGH_MAX_QUEUED_SIZE | 400 | 单个前端节点HIGH队列的最大可排队查询数为400。 |
示例
修改集群所有资源组的LOW队列最大可运行查询数均为5。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE = 5;
修改rg1资源组的LOW队列最大可运行查询数为5。
SET ADB_CONFIG rg1.XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE = 5;
查看队列并发
查看最大可运行查询数和最大排队查询数的全局设置:
SHOW ADB_CONFIG KEY=<并发参数>;
。查看某个资源组的最大可运行查询数和最大排队查询数:
SHOW ADB_CONFIG KEY=<资源组名称>.<并发参数>;
。