Hologres V3.0版本開始支持查詢隊列(Query Queue)功能,該功能可實現請求的有序處理、負載均衡和資源管理,特別是在高并發場景下,能夠確保系統的穩定性和響應效率。
功能介紹
默認情況下,請求提交到實例后,沒有任何并發控制,引擎的Coordinator將為請求分配資源執行。使用查詢隊列功能后,Hologres將根據查詢隊列中分類器已配置的匹配規則對SQL請求進行匹配,并將請求分配至不同的查詢隊列。每個查詢隊列都支持配置最大并發數,當請求數量達到最大并發數時,后續新請求會在相應的隊列中等待,直至有可用的計算資源,方可開始執行。
注意事項
查詢隊列和優化器等配置適用于實例級別(通用型實例)或計算組級別(計算組型實例)。如果一個實例下存在多個數據庫,則查詢隊列和優化器將對所有數據庫生效。
僅Hologres V3.0及以上版本的通用型和計算組型實例支持查詢隊列功能。
說明若您的實例為V2.2或以下版本,請實例升級或加入實時數倉Hologres交流群申請升級實例。加入在線支持釘釘群請參見如何獲取更多的在線支持?。
Hologres從V3.0.10版本起,支持設置某個查詢隊列的SQL全部使用Serverless Computing資源執行。查詢隊列的并發配置和排隊機制僅對本地資源生效,使用Serverless Computing資源執行的查詢不受查詢隊列并發配置和排隊機制等因素影響。
每個通用型實例以及計算組型實例中的每個計算組,默認有一個
default_queue
查詢隊列,且其最大并發限制和最大排隊限制均不設限制。default_queue
查詢隊列不支持創建分類器,只支持設置查詢隊列屬性。default_queue
可以管理所有不能被其他查詢隊列匹配的請求。
每個通用型實例以及計算組型實例中的每個計算組,支持最多創建10個查詢隊列(包含
default_queue
),每個查詢隊列最多可創建10個分類器。只讀從實例不支持單獨啟用查詢隊列功能,但可適用主實例的查詢隊列規則。
一個分類器只能歸屬于一個查詢隊列,而一個查詢隊列可以創建多個分類器。
操作步驟
創建查詢隊列
語法
通用型實例
CALL hg_create_query_queue (query_queue_name, max_concurrency, max_queue_size);
計算組型實例
CALL hg_create_query_queue (warehouse_name, query_queue_name, max_concurrency, max_queue_size);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認在當前連接的計算組中創建查詢隊列。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱,在當前實例或計算組中保持唯一,不可重復。
max_concurrency:可選,最大并發數。默認值:-1,表示沒有任何并發限制,取值范圍:[ -1 , 2147483647 )。
max_queue_size:可選,最大排隊數量,指支持的最大排隊SQL數量。默認值:-1,表示隊列無限大,取值范圍:[ -1 , 2147483647 )。
說明創建查詢隊列時僅支持配置max_concurrency和max_queue_size,其他屬性配置詳情,請參見配置查詢隊列屬性。
示例
通用型實例
-- 創建名為insert_queue的查詢隊列,并配置最大并發度為10。 CALL hg_create_query_queue ('insert_queue',10);
計算組型實例
-- 在init_warehouse計算組中,創建名為insert_queue的查詢隊列,并配置最大并發度為10。 CALL hg_create_query_queue ('init_warehouse','insert_queue',10);
創建分類器
語法
通用型實例
CALL hg_create_classifier (query_queue_name, classifier_name, priority);
計算組型實例
CALL hg_create_classifier (warehouse_name, query_queue_name, classifier_name, priority);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,待創建分類器的查詢隊列名稱。
classifier_name:必填,分類器名稱,在當前實例或計算組中保持唯一,不可重復。
priority:可選,分類器匹配優先級,數值越大優先級越高。默認值:50,取值范圍:[ 1 , 100 ]。若您創建時未配置該參數,后續可通過配置分類器屬性方式進行配置。
說明分類器的優先級越高,則匹配的順序越靠前。
當多個分類器具有相同的優先級時,將依據查詢隊列和分類器名稱的字典序進行匹配,優先匹配字典序較小的項。例如,queue_a(classifier_1) 的優先級高于 queue_b(classifier_1)。
示例
通用型實例
-- 在insert_queue的查詢隊列中,創建名為classifier_insert的分類器,匹配優先級為20 CALL hg_create_classifier ('insert_queue', 'classifier_insert', 20);
計算組型實例
-- 在init_warehouse計算組的insert_queue查詢隊列中,創建名為classifier_insert的分類器,匹配優先級為20 CALL hg_create_classifier ('init_warehouse','insert_queue', 'classifier_insert', 20);
配置分類器匹配規則
在查詢列隊中,可以通過為分類器配置匹配規則來進行SQL匹配,以確定SQL應進入相應的查詢隊列。
語法
通用型實例
CALL hg_set_classifier_rule_condition_value (query_queue_name, classifier_name, condition_name, condition_value);
計算組型實例
CALL hg_set_classifier_rule_condition_value (warehouse_name, query_queue_name, classifier_name, condition_name, condition_value);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
classifier_name:必填,待添加配置規則的分類器名稱。
condition_name和condition_value:必填,當前支持的條件屬性:
說明每次只能配置一個條件屬性,若條件值大小寫敏感,則需要帶上雙引號。
若同一種條件屬性需匹配多個條件值,則需進行多次設置。例如:若分類器對command_tag為SELECT和INSERT的請求均需匹配,則需執行兩條SQL語句進行設置。
分類器可以設置多個條件屬性,條件屬性之間為并的關系,而條件屬性內部則為或的關系。例如:存在一個分類器,該分類器包含user_name和command_tag兩個數據屬性,這兩個屬性之間為并的關系;而在user_name內設置的各個用戶則為或的關系。
user_name:當前賬號的UID。
command_tag:請求類型。取值:INSERT、SELECT、UPDATE、DELETE。
為了提高COPY操作的執行效率,Hologres是通過INSERT來實現COPY操作。因此,當INSERT操作的并發受到限制時,COPY操作的寫入并發同樣會受到影響。
db_name:數據庫名稱。
engine_type:請求使用的引擎。取值:HQE、PQE、SQE、HiveQE。
digest:SQL指紋。關于SQL指紋詳情,請參見SQL指紋。
storage_mode:存儲模式。取值:hot、cold。
示例
通用型實例
-- 在insert_queue查詢隊列的classifier_insert分類器中,設置command_tag為INSERT的匹配規則 CALL hg_set_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'command_tag', 'INSERT'); -- 在insert_queue查詢隊列的classifier_insert分類器中,設置user_name為p4_12345的匹配規則 CALL hg_set_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'user_name', 'p4_12345'); -- 在insert_queue查詢隊列的classifier_insert分類器中,設置db_name為prd_db的匹配規則 CALL hg_set_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'db_name', 'prd_db'); -- 在insert_queue查詢隊列的classifier_insert分類器中,設置engine_type為HQE的匹配規則 CALL hg_set_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'engine_type', 'HQE'); -- 在insert_queue查詢隊列的classifier_insert分類器中,設置digest為md5edb3161000a003799a5d3f2656b70b4c的匹配規則 CALL hg_set_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'digest', 'md5edb3161000a003799a5d3f2656b70b4c'); -- 在insert_queue查詢隊列的classifier_insert分類器中,設置storage_mode為hot的匹配規則 CALL hg_set_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'storage_mode', 'hot');
計算組型實例
-- 在init_warehouse計算組的insert_queue查詢隊列的classifier_insert分類器中,設置command_tag為INSERT的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'command_tag', 'INSERT'); -- 在init_warehouse計算組的insert_queue查詢隊列的classifier_insert分類器中,設置user_name為p4_12345的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'user_name', 'p4_12345'); -- 在init_warehouse計算組的insert_queue查詢隊列的classifier_insert分類器中,設置db_name為prd_db的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'db_name', 'prd_db'); -- 在init_warehouse計算組的insert_queue查詢隊列的classifier_insert分類器中,設置engine_type為HQE的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'engine_type', 'HQE'); -- 在init_warehouse計算組的insert_queue查詢隊列的classifier_insert分類器中,設置digest為md5edb3161000a003799a5d3f2656b70b4c的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'digest', 'md5edb3161000a003799a5d3f2656b70b4c'); -- 在init_warehouse計算組的insert_queue查詢隊列的classifier_insert分類器中,設置storage_mode為hot的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'storage_mode', 'hot');
更多操作
大查詢控制
為了有效控制大查詢對實例的影響,可以通過查詢隊列進行管理并控制執行時長及內存溢出(OOM)。對于超過執行時長或內存溢出(OOM)指定閾值的查詢,可以選擇終止請求或使用Serverless Computing資源進行重運行。
Hologres V3.0版本僅支持SELECT查詢Rerun。在進行查詢Rerun時,如果使用FETCH來獲取數據,為了確保結果的準確性,僅當FETCH未能獲得任何數據時,才支持按照已配置的查詢隊列規則進行查詢Rerun。
執行時長查詢控制
您可以通過配置big_query_execution_time_threshold_sec參數設置執行時長(單位:s)。默認值為-1,表示不做任何限制。取值范圍:[-1,2147483647)。示例如下:
示例1:配置select_queue查詢隊列的執行時長為10 s,若超過10 s則終止查詢。
CALL hg_set_query_queue_property ('select_queue', 'big_query_execution_time_threshold_sec', 10);
示例2:配置select_queue查詢隊列的執行時長為10 s,若超過10 s則終止查詢,并使用指定的Serverless Computing的資源重跑。
CALL hg_set_query_queue_property ('select_queue', 'big_query_execution_time_threshold_sec', 10); CALL hg_set_query_queue_property ('select_queue', 'enable_rerun_as_big_query_when_exceeded_execution_time_threshold', true); CALL hg_set_query_queue_property ('select_queue', 'rerun_big_query_on_computing_resource', 'serverless');
說明enable_rerun_as_big_query_when_exceeded_execution_time_threshold:SQL執行超過執行時長,請求被終止后,是否使用其他資源重跑。默認值為false。
rerun_big_query_on_computing_resource:指定重新執行SQL請求的Serverless Computing資源名稱。
內存溢出(OOM)查詢控制
您可以通過配置big_query_mem_threshold_when_oom_gb參數,設置內存溢出(OOM)閾值(單位:GB)。默認值為-1,表示不做任何限制。取值范圍:[-1,64)。示例如下:
--配置select_queue查詢隊列中內存溢出(OOM)為10 GB,若其中單Worker超過10 GB時,使用Serverless Computing資源重跑 CALL hg_set_query_queue_property ('select_queue', 'big_query_mem_threshold_when_oom_gb', 10); CALL hg_set_query_queue_property ('select_queue', 'enable_rerun_as_big_query_when_oom_exceeded_mem_threshold', true); CALL hg_set_query_queue_property ('select_queue', 'rerun_big_query_on_computing_resource', 'serverless');--修改為您自定義的Serverless Computing資源名稱
查詢隊列管理
刪除查詢隊列
語法
通用型實例
CALL hg_drop_query_queue (query_queue_name);
計算組型實例
CALL hg_drop_query_queue (warehouse_name, query_queue_name);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
示例
通用型實例
-- 刪除insert_queue查詢隊列 CALL hg_drop_query_queue ('insert_queue');
計算組型實例
-- 在init_warehouse計算組中,刪除insert_queue查詢隊列 CALL hg_drop_query_queue ('init_warehouse','insert_queue');
刪除查詢隊列的屬性
語法
通用型實例
CALL hg_remove_query_queue_property (query_queue_name, property_key);
計算組型實例
CALL hg_remove_query_queue_property (warehouse_name, query_queue_name, property_key);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
property_key:必填,屬性名。當前支持的相關屬性:max_concurrency、max_queue_size、queue_timeout_ms。關于屬性詳情,請參見配置查詢隊列屬性。
示例
通用型實例
-- 刪除insert_queue查詢隊列的最大并發數屬性 CALL hg_remove_query_queue_property('insert_queue', max_concurrency); -- 刪除insert_queue查詢隊列的最大排隊數屬性 CALL hg_remove_query_queue_property('insert_queue', max_queue_size); -- 刪除insert_queue查詢隊列的最大排隊時間屬性 CALL hg_remove_query_queue_property('insert_queue', queue_timeout_ms);
計算組型實例
-- 在init_warehouse計算組中,刪除insert_queue查詢隊列的最大并發數屬性 CALL hg_remove_query_queue_property('init_warehouse','insert_queue', max_concurrency); -- 在init_warehouse計算組中,刪除insert_queue查詢隊列的最大排隊數設置 CALL hg_remove_query_queue_property('init_warehouse','insert_queue', max_queue_size); -- 在init_warehouse計算組中,刪除insert_queue查詢隊列的最大排隊時間屬性 CALL hg_remove_query_queue_property('init_warehouse','insert_queue', queue_timeout_ms);
查看查詢隊列元數據
查詢隊列的元數據存儲于系統表hologres.hg_query_queues
中。其主要包含的字段信息如下:
字段名稱 | 字段類型 | 說明 |
warehouse_id | INT | 計算組ID。 說明 通用型實例的warehouse_id字段值為0。 |
warehouse_name | TEXT | 計算組名稱。 說明 通用型實例的warehouse_name為空。 |
query_queue_name | TEXT | 查詢隊列名稱。 |
property_key | TEXT | 屬性名。 |
property_value | TEXT | 屬性值。 |
配置查詢隊列屬性
語法
通用型實例
CALL hg_set_query_queue_property (query_queue_name, property_key, property_value);
計算組型實例
CALL hg_set_query_queue_property (warehouse_name, query_queue_name, property_key, property_value);
參數說明
warehouse_name:可選,待配置查詢隊列屬性的計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,待配置查詢隊列屬性的查詢隊列名稱。
property_key和property_value:必填,當前支持的相關屬性:
max_concurrency:最大并發數。默認值:-1,表示沒有任何并發限制,取值范圍:[ -1 , 2147483647 )。
max_queue_size:最大排隊數量,指支持的最大排隊SQL數量。默認值:-1,表示隊列無限大,取值范圍:[ -1 , 2147483647 )。
queue_timeout_ms:最長排隊時長(單位:ms),即在排隊時長超過該值時,將自動關閉查詢。默認值:-1,表示不限制排隊時長,取值范圍:[ -1 , 2147483647 )。
示例
通用型實例
-- 配置insert_queue查詢隊列的最大并發數為15 CALL hg_set_query_queue_property('insert_queue', max_concurrency, 15); -- 配置insert_queue查詢隊列的最大排隊數為15 CALL hg_set_query_queue_property('insert_queue', max_queue_size, 15); -- 配置insert_queue的查詢隊列的最大排隊時間為3000 ms CALL hg_set_query_queue_property('insert_queue', queue_timeout_ms, 3000);
計算組型實例
-- 在init_warehouse計算組中,將insert_queue查詢隊列的最大并發數為15 CALL hg_set_query_queue_property('init_warehouse','insert_queue', max_concurrency, 15); -- 在init_warehouse計算組中,將insert_queue查詢隊列的最大排隊數為15 CALL hg_set_query_queue_property('init_warehouse','insert_queue', max_queue_size, 15); -- 在init_warehouse計算組中,將insert_queue查詢隊列的最大排隊時間為3000 ms CALL hg_set_query_queue_property('init_warehouse','insert_queue', queue_timeout_ms, 3000);
清空指定查詢隊列中正在排隊的請求
語法
通用型實例
CALL hg_clear_query_queue (query_queue_name);
計算組型實例
CALL hg_clear_query_queue (warehouse_name, query_queue_name);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
示例
通用型實例
-- 清空select_queue查詢隊列中正在排隊的所有請求 CALL hg_clear_query_queue ('select_queue');
計算組型實例
-- 清空init_warehouse計算組中,select_queue查詢隊列中正在排隊的所有請求 CALL hg_clear_query_queue ('init_warehouse', 'select_queue');
分類器管理
刪除分類器
語法
通用型實例
CALL hg_drop_classifier (query_queue_name, classifier_name);
計算組型實例
CALL hg_drop_classifier (warehouse_name, query_queue_name, classifier_name);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,待創建分類器的查詢隊列名稱。
classifier_name:必填,分類器名稱。
示例
通用型實例
-- 在insert_queue查詢隊列中,刪除classifier_insert分類器 CALL hg_drop_classifier ('insert_queue', 'classifier_insert');
計算組型實例
-- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert分類器 CALL hg_drop_classifier ('init_warehouse','insert_queue', 'classifier_insert');
刪除分類器屬性
語法
通用型實例
CALL hg_remove_classifier_property (query_queue_name, classifier_name, property_key);
計算組型實例
CALL hg_remove_classifier_property (warehouse_name, query_queue_name, classifier_name, property_key);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
classifier_name:必填,分類器名稱。
property_key:必填,當前支持的相關屬性:priority。關于分類器屬性詳情,請參見配置分類器屬性。
示例
通用型實例
-- 在insert_queue查詢隊列中,刪除classifier_insert分類器的優先級屬性 CALL hg_remove_classifier_property ('insert_queue', 'classifier_insert','priority');
計算組型實例
-- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert分類器的優先級屬性 CALL hg_remove_classifier_property ('init_warehouse','insert_queue', 'classifier_insert','priority');
配置分類器屬性
語法
通用型實例
CALL hg_set_classifier_property (query_queue_name, classifier_name, property_key, property_value);
計算組型實例
CALL hg_set_classifier_property (warehouse_name, query_queue_name, classifier_name, property_key, property_value);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
classifier_name:必填,分類器名稱。
property_key和property_value:必填,當前支持的相關屬性:
priority:分類器匹配優先級,數值越大優先級越高。默認值:50,取值范圍:[ 1 , 100 ]。
說明分類器的優先級越高,則匹配的順序越靠前。
當多個分類器具有相同的優先級時,將依據查詢隊列和分類器名稱的字典序進行匹配,優先匹配字典序較小的項。例如,queue_a(classifier_1) 的優先級高于 queue_b(classifier_1)。
示例
通用型實例
-- 在insert_queue查詢隊列中,設置classifier_insert分類器的優先級為30 CALL hg_set_classifier_property ('insert_queue', 'classifier_insert','priority', 30);
計算組型實例
-- 在init_warehouse計算組的insert_queue的查詢隊列中,設置classifier_insert分類器的優先級為30 CALL hg_set_classifier_property ('init_warehouse','insert_queue', 'classifier_insert','priority', 30);
刪除分類器匹配規則
刪除分類器中指定條件屬性(condition_name)的一條匹配規則
語法
通用型實例
CALL hg_remove_classifier_rule_condition_value (query_queue_name, classifier_name, condition_name, condition_value);
計算組型實例
CALL hg_remove_classifier_rule_condition_value (warehouse_name, query_queue_name, classifier_name, condition_name, condition_value);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
classifier_name:必填,分類器名稱。
condition_name和condition_value:必填,待刪除的條件屬性名稱和取值。當前支持的條件屬性:user_name、command_tag、db_name、engine_type、digest、storage_mode。關于分類器匹配規則的條件屬性詳情,請參見配置分類器匹配規則。
示例
通用型實例
-- 在名為insert_queue的查詢隊列中,刪除classifier_insert分類器中command_tag為INSERT的匹配規則 CALL hg_remove_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'command_tag', 'INSERT'); -- 在名為insert_queue的查詢隊列中,刪除classifier_insert分類器中user_name為p4_12345的匹配規則 CALL hg_remove_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'user_name', 'p4_12345'); -- 在名為insert_queue的查詢隊列中,刪除classifier_insert分類器中db_name為prd_db的匹配規則 CALL hg_remove_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'db_name', 'prd_db'); -- 在名為insert_queue的查詢隊列中,刪除classifier_insert分類器中engine_type為HQE的匹配規則 CALL hg_remove_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'engine_type', 'HQE'); -- 在名為insert_queue的查詢隊列中,刪除classifier_insert分類器中digest為md5edb3161000a003799a5d3f2656b70b4c的匹配規則 CALL hg_remove_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'digest', 'md5edb3161000a003799a5d3f2656b70b4c'); -- 在名為insert_queue的查詢隊列中,刪除classifier_insert分類器中storage_mode為hot的匹配規則 CALL hg_remove_classifier_rule_condition_value ('insert_queue', 'classifier_insert', 'storage_mode', 'hot');
計算組型實例
-- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert分類器中command_tag為INSERT的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'command_tag', 'INSERT'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert分類器中user_name為p4_12345的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'user_name', 'p4_12345'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert分類器中db_name為prd_db的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'db_name', 'prd_db'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert分類器中engine_type為HQE的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'engine_type', 'HQE'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert分類器中digest為md5edb3161000a003799a5d3f2656b70b4c的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'digest', 'md5edb3161000a003799a5d3f2656b70b4c'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除classifier_insert的分類器中storage_mode為hot的匹配規則 CALL hg_set_classifier_rule_condition_value ('init_warehouse','insert_queue', 'classifier_insert', 'storage_mode', 'hot');
刪除分類器中指定條件屬性(condition_name)的所有匹配規則
語法
通用型實例
CALL hg_remove_classifier_rule_condition (query_queue_name, classifier_name, condition_name);
計算組型實例
CALL hg_remove_classifier_rule_condition (warehouse_name, query_queue_name, classifier_name, condition_name);
參數說明
warehouse_name:可選,計算組名稱。如果未配置warehouse_name參數,則默認使用當前連接的計算組。
說明僅計算組型實例需配置此參數。
query_queue_name:必填,查詢隊列名稱。
classifier_name:必填,分類器名稱。
condition_name:必填,待刪除的條件屬性名稱。關于分類器匹配規則的條件屬性詳情,請參見配置分類器匹配規則。條件屬性當前支持的條件屬性user_name、command_tag、db_name、engine_type、digest、storage_mode。
示例
通用型實例
-- 在名為insert_queue的查詢隊列中,刪除classifier_insert分類器中command_tag相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('insert_queue', 'classifier_insert', 'command_tag'); -- 在名為insert_queue的查詢隊列中,刪除名為classifier_insert的分類器中 user_name 相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('insert_queue', 'classifier_insert', 'user_name'); -- 在名為insert_queue的查詢隊列中,刪除名為classifier_insert的分類器中 db_name 相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('insert_queue', 'classifier_insert', 'db_name'); -- 在名為insert_queue的查詢隊列中,刪除名為classifier_insert的分類器中 engine_type 相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('insert_queue', 'classifier_insert', 'engine_type'); -- 在名為insert_queue的查詢隊列中,刪除名為classifier_insert的分類器中 digest 相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('insert_queue', 'classifier_insert', 'digest'); -- 在名為insert_queue的查詢隊列中,刪除名為classifier_insert的分類器中 storage_mode 相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('insert_queue', 'classifier_insert', 'storage_mode');
計算組型實例
-- 在init_warehouse計算組的insert_queue查詢隊列中,刪除名為classifier_insert的分類器中command_tag相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('init_warehouse','insert_queue', 'classifier_insert', 'command_tag'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除名為classifier_insert的分類器中user_name相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('init_warehouse','insert_queue', 'classifier_insert', 'user_name'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除名為classifier_insert的分類器中db_name相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('init_warehouse','insert_queue', 'classifier_insert', 'db_name'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除名為classifier_insert的分類器中engine_type相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('init_warehouse','insert_queue', 'classifier_insert', 'engine_type'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除名為classifier_insert的分類器中digest相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('init_warehouse','insert_queue', 'classifier_insert', 'digest'); -- 在init_warehouse計算組的insert_queue查詢隊列中,刪除名為classifier_insert的分類器中storage_mode相關的所有匹配規則 CALL hg_remove_classifier_rule_condition ('init_warehouse','insert_queue', 'classifier_insert', 'storage_mode');
查看分類器元數據
分類器的元數據存儲于系統表hologres.hg_classifiers
中。其主要包含的字段信息如下:
字段 | 字段類型 | 說明 |
warehouse_id | INT | 計算組ID。 說明 通用型實例的warehouse_id字段值為0。 |
warehouse_name | TEXT | 計算組名稱。 說明 通用型實例的arehouse_name為空。 |
query_queue_name | TEXT | 查詢隊列名稱。 |
classifier_name | TEXT | 分類器名稱。 |
property_key | TEXT | 屬性名。 |
property_value | TEXT | 屬性值。 |
使用Serverless Computing資源執行查詢隊列的查詢
Hologres從V3.0.10版本起,支持指定某個查詢隊列中的查詢全部由Serverless Computing資源執行。設置后,隊列中的查詢將按請求順序和配置的優先級申請Serverless資源執行,不再受查詢隊列的并發配置、排隊機制等因素影響。詳情請參見Serverless Computing使用指南。
如果實例所在可用區不支持Serverless Computing,仍將使用本實例計算資源執行。
通用型實例
語法
-- 設置目標Queue中的查詢全部通過Serverless資源運行 CALL hg_set_query_queue_property('<query_queue_name>', 'computing_resource', 'serverless'); -- (可選)設置目標Queue中的查詢使用Serverless資源時的優先級,支持1-5,默認為3 CALL hg_set_query_queue_property('<query_queue_name>', 'query_priority_when_using_serverless_computing', '<priority>');
參數說明
query_queue_name:必填,查詢隊列名稱。
priority:優先級,默認為3,取值范圍
[1, 5]
。
示例
-- 設置目標Queue中的查詢全部通過Serverless資源運行 CALL hg_set_query_queue_property('insert_queue', 'computing_resource', 'serverless'); -- 設置目標Queue中的查詢使用Serverless資源時的優先級為2 CALL hg_set_query_queue_property('insert_queue', 'query_priority_when_using_serverless_computing', '2');
計算組型實例
語法
-- 設置目標Queue中的查詢全部通過Serverless資源運行 CALL hg_set_query_queue_property('<warehouse_name>', '<query_queue_name>', 'computing_resource', 'serverless'); -- (可選)設置目標Queue中的查詢使用Serverless資源時的優先級,支持1-5,默認為3 CALL hg_set_query_queue_property('<warehouse_name>', '<query_queue_name>', 'query_priority_when_using_serverless_computing', '<priority>');
參數說明
warehouse_name:必填,計算組名稱。
query_queue_name:必填,查詢隊列名稱。
priority:必填,優先級,默認為3,取值范圍
[1, 5]
。
示例
-- 設置目標Queue中的查詢全部通過Serverless資源運行 CALL hg_set_query_queue_property('init_warehouse', 'insert_queue', 'computing_resource', 'serverless'); -- 設置目標Queue中的查詢使用Serverless資源時的優先級為2 CALL hg_set_query_queue_property('init_warehouse', 'insert_queue', 'query_priority_when_using_serverless_computing', '2');
常見場景
查看指定SQL使用的查詢隊列
通過EXPLAIN查看具體使用的查詢隊列,其中Query Queue字段即使用的查詢隊列。示例如下。
-- 創建查詢隊列,并發度為 10,最大排隊數量為 20
CALL hg_create_query_queue ('select_queue', 10, 20);
-- 創建分類器并綁定 command_tag 屬性
CALL hg_create_classifier ('select_queue', 'classifier_1');
CALL hg_set_classifier_rule_condition_value ('select_queue', 'classifier_1', 'command_tag', 'select');
-- 通過 Explain Analyze 查看 Query 所匹配的 Classifier 和 Query queue
EXPLAIN ANALYZE SELECT * FROM hg_stat_activity;
返回結果如下。
QUERY PLAN
Gather (cost=0.00..14.96 rows=1000 width=408)
[4:1 id=100003 dop=1 time=16/16/16ms rows=142(142/142/142) mem=43/43/43KB open=0/0/0ms get_next=16/16/16ms]
-> Forward (cost=0.00..12.19 rows=1000 width=408)
[0:4 id=100002 dop=4 time=16/8/5ms rows=142(39/35/33) mem=6/6/6KB open=16/8/5ms get_next=0/0/0ms scan_rows=142(39/35/33)]
-> ExecuteExternalSQL on PQE (cost=0.00..10.04 rows=0 width=408)
" External SQL: SELECT "datid" AS c_d2adb610_0, "datname" AS c_d2adb760_1, "pid" AS c_d2adb8a0_2, "usesysid" AS c_d2adba10_3, "usename" AS c_d2adbb60_4, "application_name" AS c_d2adbd10_5, "client_addr" AS c_d2adbe80_6, "client_hostname" AS c_d2df1020_7, "client_port" AS c_d2df1190_8, "backend_start" AS c_d2df1300_9, "xact_start" AS c_d2df1470_10, "query_start" AS c_d2df15e0_11, "state_change" AS c_d2df1750_12, "wait_event_type" AS c_d2df18c0_13, "wait_event" AS c_d2df1a30_14, "state" AS c_d2df1b80_15, "backend_xid" AS c_d2df1cf0_16, "backend_xmin" AS c_d2df1e60_17, "query" AS c_d2df1fb0_18, "backend_type" AS c_d2df2120_19, "query_id" AS c_d2df2290_20, "transaction_id" AS c_d2df2400_21, "extend_info" AS c_d2df2570_22, "running_info" AS c_d2df26e0_23 FROM pg_catalog."hg_stat_activity""
Query id:[1001002491453065719]
Query Queue: init_warehouse.select_queue.classifier_1
查看活躍Query中SQL使用的查詢隊列
可以通過如下SQL查看活躍Query中SQL使用的查詢隊列名稱、當前狀態和排隊時間等信息。
SELECT
running_info::json -> 'current_stage' ->> 'stage_name' AS stage_name,
running_info::json -> 'current_stage' ->> 'queue_time_ms' AS queue_time_ms,
running_info::json ->> 'query_queue' AS query_queue,
*
FROM
hg_stat_activity;
查看Query Log中SQL使用的查詢隊列
可以使用如下SQL查看Query Log中的SQL使用的查詢隊列、當前狀態和排隊時間,其中query_detail字段會記錄SQL使用的查詢隊列。關于hologres.hg_query_log系統表詳情,請參見查看query_log表。
SELECT * FROM hologres.hg_query_log WHERE query_detail like '%query_queue = <warehouse_name>.<queue_name>%';--僅計算組類型實例需配置該參數warehouse_name
執行上述SQL返回的extended_info
字段,包含以下信息:
serverless_computing_source
:表示SQL來源,表示使用Serverless Computing資源執行的SQL。取值如下:user_submit
:自行指定使用Serverless資源執行的SQL,與Query Queue無關。query_queue
:指定查詢隊列的SQL全部由Serverless資源執行。query_queue_rerun
:通過Query Queue的大查詢控制功能,自動使用Serverless資源重新運行的SQL。
query_id_of_triggered_rerun
:該字段僅在serverless_computing_source為query_queue_rerun時存在,表示重新運行的SQL對應的原始Query ID。
創建不同匹配規則的查詢隊列
示例1:創建請求類型為INSERT匹配規則的查詢隊列。示例如下。
創建完成后,所有INSERT類型的SQL請求將被classifier_1分類器匹配并分配到insert_queue查詢隊列。
-- 創建查詢隊列,并發度為 10,最大排隊數量為 20 CALL hg_create_query_queue ('insert_queue', 10, 20); -- 創建分類器并綁定 command_tag 屬性 CALL hg_create_classifier ('insert_queue', 'classifier_1'); CALL hg_set_classifier_rule_condition_value ('insert_queue', 'classifier_1', 'command_tag', 'INSERT');
創建用戶為p4_123和p4_345匹配規則的查詢隊列。示例如下。
創建完成后,p4_123、p4_345用戶提交的SQL請求將被classifier_2分類器匹配并分配到user_queue查詢隊列。
-- 創建查詢隊列,并發度為 3,最大排隊數量為無窮大 CALL hg_create_query_queue ('user_queue', 3); CALL hg_set_query_queue_property('user_queue','max_queue_size', -1) -- 創建分類器并設置user_name匹配規則 CALL hg_create_classifier ('user_queue', 'classifier_2'); CALL hg_set_classifier_rule_condition_value ('user_queue', 'classifier_2', 'user_name', 'p4_123'); CALL hg_set_classifier_rule_condition_value ('user_queue', 'classifier_2', 'user_name', 'p4_345');
創建數據庫名稱為test和postgres DB匹配規則的查詢隊列。示例如下。
創建完成后,test和postgres DB數據庫相關的SQL請求將被classifier_3分類器匹配并分配到db_queue查詢隊列。
-- 創建查詢隊列,并發度為 5 CALL hg_create_query_queue ('db_queue', 5); -- 設置最大排隊時間為600000 ms,排隊超過這個時間則報錯 CALL hg_set_query_queue_property ('db_queue', 'queue_timeout_ms', '600000'); -- 創建分類器并綁定 db_name 屬性 CALL hg_create_classifier ('db_queue', 'classifier_3'); CALL hg_set_classifier_rule_condition_value ('db_queue', 'classifier_3', 'db_name', 'test'); CALL hg_set_classifier_rule_condition_value ('db_queue', 'classifier_3', 'db_name', 'postgres');
創建引擎類型為HQE匹配規則的查詢隊列。示例如下。
創建完成后,HQE引擎相關的SQL請求將被classifier_4分類器匹配并分配到hqe_queue查詢隊列。
-- 創建查詢隊列,并發度為10 CALL hg_create_query_queue ('hqe_queue', 10); -- 創建分類器并綁定engine_type屬性 CALL hg_create_classifier ('hqe_queue', 'classifier_4'); CALL hg_set_classifier_rule_condition_value ('hqe_queue', 'classifier_4', 'engine_type', 'HQE');
禁止所有任務(極端場景)
將insert_queue查詢隊列的并發度和排隊數設置為0。示例如下。
CALL hg_set_query_queue_property ('insert_queue', 'max_concurrency', '0');
CALL hg_set_query_queue_property ('insert_queue', 'max_queue_size', '0');