為了更細緻地控制查詢並發數,AnalyticDB for 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=<資源群組名稱>.<並發參數>;
。