设置Interactive型资源组的优先级队列与并发数

更新时间:

为了更细致地控制查询并发数,云原生数据仓库 AnalyticDB MySQL 版的Interactive型资源组提供了优先级队列的能力。每个资源组都有自己的一组优先级队列,包括LOWEST队列、LOW队列、NORMAL队列和HIGH队列。您可以设置查询的优先级,使不同查询进入不同的优先级队列,并通过修改队列并发数来对查询进行限流或放大并发。本文介绍如何设置查询的优先级,以及如何设置队列的并发数。

前提条件

集群的内核版本为3.1.6.3及以上版本。

说明
  • 查看企业版基础版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

  • 查看和升级数仓版集群的内核版本,请参见查看和升级版本

功能概述

查询优先级

每个Interactive型资源组都有一组查询优先级队列。一组查询优先级队列包含四个队列,分别为LOWEST队列、LOW队列、NORMAL队列和HIGH队列。默认情况下,普通SELECT查询进入NORMAL队列,其他ETL查询(例如INSERT INTO SELECTDELETE SELECTINSERT 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=<资源组名称>.<并发参数>;