云原生数据仓库AnalyticDB MySQL版支持为内部系统查询、用户普通查询、用户ETL(Extract-Transform-Load)类查询三种查询队列设置最大可运行查询数以及最大排队查询数。
查询队列
为了隔离内部系统查询、用户普通查询、用户ETL(Extract-Transform-Load)类查询(例如INSERT INTO SELECT等)三种查询流量,云原生数据仓库AnalyticDB MySQL版接入层将这三种查询的查询队列进行了隔离。
- 当查询队列里正在执行的查询数量≥最大可运行查询数时,新的查询将进入排队状态;
- 当查询队列里排队状态的查询数量≥最大排队查询数时,新的查询将直接被拒绝;
- 当正在执行的查询结束时,如果有排队状态的查询,会以FIFO的方式,从排队状态的查询中取下一个查询进入执行状态。
INSERT INTO ... VALUE(...)
语句不生效。
配置参数
- 查询队列的参数取值代表单个前端节点的队列大小,不是集群的队列总大小。集群的队列总大小等于单个队列乘以前端节点个数,即
集群的队列总大小=单个队列×前端节点个数
。 - 查询队列的参数配置对全局前端节点同时生效。
查询类型 | 查询队列 | 配置参数 | 配置项 |
---|---|---|---|
系统查询 | ROOT | 固定取值,不支持配置。 |
|
用户普通查询 | NORMAL | XIHE_ENV_QUERY_MAX_CONCURRENT_QUERIES | 针对用户普通查询,单个前端节点的最大可运行查询数,参数取值范围为1~20。
假设参数取值为20,集群包含3个前端节点,则每个前端节点的最大可运行查询数为20,集群总的最大可运行查询数为60。 |
XIHE_ENV_QUERY_MAX_QUEUED_QUERIES | 针对用户普通查询,单个前端节点的最大排队查询数,参数取值范围为1~200。
假设参数取值为200,集群包含3个前端节点,则每个前端节点的最大排队查询数为200,集群总的最大排队查询数为600。 |
||
用户ETL查询 | LOW | XIHE_ENV_QUERY_ETL_MAX_CONCURRENT_SIZE | 针对用户ETL查询,单个前端节点的最大可运行查询数,参数取值范围为1~20。
假设参数取值为10,集群包含3个前端节点,则每个前端节点的最大可运行查询数为10,集群总的最大可运行查询数为30。 |
XIHE_ENV_QUERY_ETL_MAX_QUEUED_SIZE | 针对用户ETL查询,单个前端节点的最大排队查询数,参数取值范围为1~100。
假设参数取值为100,集群包含3个前端节点,则每个前端节点的最大排队查询数为100,集群总的最大排队查询数为300。 |
调整查询队列
- 查询队列的参数取值代表单个前端节点的队列大小,不是集群的队列总大小。集群的队列总大小等于单个队列乘以前端节点个数,即
集群的队列总大小=单个队列×前端节点个数
。 - 查询队列的参数配置对全局前端节点同时生效。
--用户普通查询队列
set adb_config XIHE_ENV_QUERY_MAX_CONCURRENT_QUERIES=20
set adb_config XIHE_ENV_QUERY_MAX_QUEUED_QUERIES=200
--用户ETL查询
set adb_config XIHE_ENV_QUERY_ETL_MAX_CONCURRENT_SIZE=20
set adb_config XIHE_ENV_QUERY_ETL_MAX_QUEUED_SIZE=100
上述示例,针对用户普通查询,设置单个前端节点的最大可运行查询数为20,最大排队查询数为200;针对用户ETL查询,设置单个前端节点的最大可运行查询数为20,最大排队查询数为100。
指定查询队列
-- 通过Hint指定查询使用LOW队列
/*+coordinator_query_queue=low_priority*/ select * from tbl limit 100;
-- 普通查询使用NORMAL队列
select * from tbl limit 100;
-- ETL查询默认使用LOW队列
insert into dst select * from tbl;
执行优先级
云原生数据仓库AnalyticDB MySQL版的计算模块在执行查询时,为了隔离用户普通查询、用户ETL查询,将查询执行线程也进行了隔离。查询执行线程分为两组NORMAL和LOW:
- 内部系统查询、用户普通查询由NORMAL线程组执行。
- 用户ETL查询由LOW线程组执行。
NORMAL线程组相比LOW线程组具有更高的优先级,二者产生资源竞争时,NORMAL线程优先获得CPU资源。
查询类型 | 执行线程组 | 优先级 |
---|---|---|
系统查询、普通用户查询 | NORMAL | 高 |
用户ETL查询 | LOW | 低 |
设置执行优先级
-- 通过Hint指定查询使用LOW线程组
/*+direct_low_priority_cpu_queue=true*/ select * from tbl limit 100;
-- 普通查询使用NORMAL线程组
select * from tbl limit 100;
-- ETL查询默认使用LOW线程组
insert into dst select * from tbl;