自 2025 年 11 月 1 日起,Amazon Redshift 將不再支援建立新的 Python UDFs。如果您想要使用 Python UDFs,請在該日期之前建立 UDFs。現有的 Python UDFs將繼續如常運作。如需詳細資訊,請參閱部落格文章
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
工作負載管理
您可在 Amazon Redshift 中用工作負載管理 (WLM) 定義可用的查詢佇列數量,以及查詢如何路由至佇列進行處理。WLM 為參數群組組態的一部分。叢集將使用在其相關聯參數群組中指定的 WLM 組態。
建立參數群組時,預設的 WLM 組態將包含一個佇列,其最多可同時執行五個查詢。如果您想更有效地控制查詢處理功能,可新增其他佇列並設定其各自的 WLM 屬性。您所新增的每個佇列都會擁有相同的預設 WLM 組態,除非您設定其屬性。
新增額外的佇列時,組態中最後一個佇列為預設佇列。除非查詢依照 WLM 組態中的條件路由至其他佇列,否則皆由預設佇列處理。您可以為預設佇列指定模式和並行層級 (查詢槽),但無法指定預設佇列的使用者群組或查詢群組。
如同其他參數,您也無法修改預設參數群組中的 WLM 組態。與預設參數群組相關聯的叢集永遠使用預設的 WLM 組態。若要修改 WLM 組態,請建立新的參數群組,然後將該參數群組與需要自訂 WLM 組態的任何叢集相關聯。
WLM 動態和靜態屬性
WLM 屬性分為動態和靜態兩種。您可在不重新啟動叢集的情形下,將動態屬性套用至資料庫,但靜態屬性需要重新啟動叢集才能讓變更生效。如需動態和靜態組態屬性的相關資訊,請參閱 WLM 動態和靜態組態屬性。
WLM 組態參數的屬性
您可以使用 Amazon Redshift 主控台、 AWS CLI、Amazon Redshift API 或其中一個 AWS SDKs 來設定 WLM。WLM 組態使用多項屬性定義佇列行為,例如跨佇列的記憶體配置、佇列中可同時執行的查詢數量等。
注意
以下顯示屬性將同時在說明中列出其 Amazon Redshift 主控台名稱,以及對應的 JSON 屬性名稱。
下表摘要顯示屬性適用於自動 WLM 或是手動 WLM。
| WLM 屬性 | 自動 WLM | 手動 WLM |
|---|---|---|
| Auto WLM (自動 WLM) | 是 | 是 |
| 啟用短期查詢加速 | 是 | 是 |
| 短期查詢最長執行時間 | 是 | 是 |
| 優先順序 | 是 | 否 |
| 佇列類型 | 是 | 是 |
| 佇列名稱 | 是 | 是 |
| 並行擴展模式 | 是 | 是 |
| 並行數量 | 否 | 是 |
| 使用者群組 | 是 | 是 |
| 使用者群組萬用字元 | 是 | 是 |
| 查詢群組 | 是 | 是 |
| 查詢群組萬用字元 | 是 | 是 |
| 使用者角色 | 是 | 是 |
| 使用者角色萬用字元 | 是 | 是 |
| 逾時 | 否 | 已棄用 |
| 記憶體 | 否 | 是 |
| 查詢監控規則 | 是 | 是 |
下列清單說明您可以設定的 WLM 屬性。
- Auto WLM (自動 WLM)
-
Auto WLM (自動 WLM) 設為
true可啟用自動 WLM。自動 WLM 會將主體的並行和記憶體 (%) 的值設為Auto。Amazon Redshift 可管理查詢並行和記憶體配置。預設值為true。JSON 屬性:
auto_wlm - Enable short query acceleration (啟用短期查詢加速)
-
短期查詢加速 (SQA) 可排定讓短期執行的查詢優先於長期執行的查詢。SQA 會在專用佇列中執行短期查詢,所以 SQA 查詢不會被迫在佇列中排在長期查詢後面等待。SQA 可讓短期執行的查詢更快開始執行,使用者會更快看到結果。啟用 SQA 時,您也可以指定短期查詢的最長執行時間。若要啟用 SQA,請使用
true。預設值為false。此設定適用於每個參數群組,而不是佇列。JSON 屬性:
short_query_queue - 短期查詢最長執行時間
-
啟用 SQA 時,您可指定 0,讓 WLM 動態設定短期查詢的最長執行時間。或者,您也可以指定 1–20 秒 (以毫秒為單位) 的值。預設值為
0。JSON 屬性:
max_execution_time - 優先順序
-
優先順序設定在佇列中執行之查詢的優先順序。若要設定優先順序,WLM mode (WLM 模式) 必須設定為 Auto WLM (自動 WLM);也就是說,
auto_wlm必須是true。優先順序值可以是highest、high、normal、low和lowest。預設值為normal。JSON 屬性:
priority - 佇列類型
-
佇列類型指定佇列由 Auto WLM (自動 WLM) 或 Manual WLM (手動 WLM) 使用。將
queue_type設定為auto或manual。若沒有指定,則預設為manual。JSON 屬性:
queue_type - 佇列名稱
-
佇列的名稱。您可以根據商業需求設定佇列名稱。佇列名稱在 WLM 組態內必須是唯一的,最多可包含 64 個英數字元、底線或空格,且不能包含引號。例如,如果您有 ETL 查詢的佇列,則可以將其命名為
ETL queue。此名稱用於指標、系統資料表值和 Amazon Redshift 主控台中,以識別佇列。使用來自這些來源之名稱的查詢和報告必須能夠處理名稱的變更。先前,佇列名稱是由 Amazon Redshift 產生的。佇列的預設名稱是Queue 1、Queue 2到最後一個名為Default queue的佇列。重要
如果您變更佇列名稱,WLM 佇列指標的
QueueName維度值 (例如 WLMQueueLength、WLMQueueWaitTime、WLMQueriesCompletedPerSecond、WLMQueryDuration、WLMRunningQueries 等) 也會變更。因此,如果您變更佇列的名稱,則可能需要變更您已設定的 CloudWatch 警報。JSON 屬性:
name - Concurrency Scaling mode (並行擴展模式)
-
若要啟用佇列的並行擴展,請將 Concurrency Scaling mode (並行擴展模式) 設定為
auto。當路由至佇列的查詢數量超過佇列設定的並行時,合格查詢將前往擴展叢集。當有可用的空位時,查詢會執行於主要叢集。預設值為off。JSON 屬性:
concurrency_scaling - 並行數量
-
手動 WLM 佇列中可同時執行的查詢數量。此屬性僅適用於手動 WLM。如果並行擴展已啟用,當佇列達到並行層級 (查詢槽) 時,合格查詢將前往擴展叢集。如果並行擴展未啟用,查詢會在佇列中等待,直到有空位為止。範圍介於 1 與 50 之間。
JSON 屬性:
query_concurrency - User Groups (使用者群組)
-
逗號分隔的使用者群組名稱清單。使用者群組的成員在資料庫內執行查詢時,其查詢會路由至與其使用者群組相關聯的佇列。
JSON 屬性:
user_group - User Group Wildcard (使用者群組萬用字元)
-
布林值類型,用以指示是否啟用使用者群組的萬用字元。如果為 0,表示萬用字元為停用;如果為 1,表示萬用字元為啟用。當萬用字元啟用時,您可以在執行查詢時使用 "*" 或 "?" 來指定多個使用者群組。如需詳細資訊,請參閱萬用字元。
JSON 屬性:
user_group_wild_card - Query Groups (查詢群組)
-
逗號分隔的查詢群組清單。查詢群組的成員在資料庫內執行查詢時,其查詢會路由至與其查詢群組相關聯的佇列。
JSON 屬性:
query_group - Query Group Wildcard (查詢群組萬用字元)
-
布林值類型,用以指示是否啟用查詢群組的萬用字元。如果為 0,表示萬用字元為停用;如果為 1,表示萬用字元為啟用。當萬用字元啟用時,您可以在執行查詢時使用 "*" 或 "?" 來指定多個查詢群組。如需詳細資訊,請參閱萬用字元。
JSON 屬性:
query_group_wild_card - 使用者角色
-
逗號分隔的使用者角色清單。具有該使用者角色的成員在資料庫內執行查詢時,其查詢會路由至與其使用者角色相關聯的佇列。如需使用者角色的相關資訊,請參閱角色型存取控制 (RBAC)。
JSON 屬性:
user_role - 使用者角色萬用字元
-
布林值類型,用以指示是否啟用查詢群組的萬用字元。如果為 0,表示萬用字元為停用;如果為 1,表示萬用字元為啟用。當萬用字元啟用時,您可以在執行查詢時使用 "*" 或 "?" 來指定多個查詢群組。如需詳細資訊,請參閱萬用字元。
JSON 屬性:
user_role_wild_card - Timeout (ms) (逾時 (毫秒))
-
WLM 逾時 (
max_execution_time) 已作廢。使用自動 WLM 時無法使用此功能。這時請改成使用query_execution_time建立查詢監控規則 (QMR),以限制查詢的經歷執行時間。如需詳細資訊,請參閱 WLM 查詢監控規則。查詢遭取消前所能執行的最長時間 (毫秒)。在某些情況下,唯讀查詢 (例如 SELECT 陳述式) 可能因為 WLM 逾時而被取消。在這些情況下,WLM 會嘗試根據 WLM 佇列指派規則,將查詢路由至下一個相符的佇列。如果查詢不符合任何其他的佇列定義,此查詢將取消;不會指派給預設佇列。如需詳細資訊,請參閱 WLM 查詢佇列跳轉。WLM 逾時不會套用到已達到
returning狀態的查詢。若要檢視查詢的狀態,請參閱 STV_WLM_QUERY_STATE 系統資料表。JSON 屬性:
max_execution_time - Memory (%) (記憶體 (%))
-
配置給佇列的記憶體百分比。若您要為至少一個佇列指定記憶體百分比,您必須為所有其他佇列指定總共 100% 的記憶體。如果所有佇列合計的記憶體配置低於 100%,則未配置的記憶體由該服務管理。該服務可將未配置的記憶體,暫時提供給需要更多記憶體來處理的佇列。
JSON 屬性:
memory_percent_to_use - 查詢監控規則
-
您可以使用 WLM 查詢監控規則依照指定的條件或述詞持續監控查詢的 WLM 佇列。例如,您可監控經常使用過多系統資源的查詢,並在查詢超過指定的效能邊界時啟動指定動作。
注意
如果您選擇以程式設計方式建立規則,強烈建議您使用主控台來產生 JSON,再加入參數群組定義中。
您需將查詢監控規則與特定的查詢佇列相關聯。每個佇列最多可以有 25 個規則,而全部佇列合計最多 25 規則。
JSON 屬性:
rulesJSON 屬性階層:
rules rule_name predicate metric_name operator value action value針對每個規則,您指定下列屬性:
-
rule_name— 規則名稱在 WLM 組態內必須是唯一的。規則名稱最多為 32 個英數字元或底線,且不可含有空格和問號。-
predicate— 每個規則最多可以有三個述詞。針對每個述詞,您指定下列屬性。-
metric_name— 如需指標清單,請參閱《Amazon Redshift 資料庫開發人員指南》中的查詢監控指標。 -
operator— 運算子為=、<和>。 -
value— 觸發動作之指定指標的閾值。
-
-
-
action— 每個規則都與一個動作相關聯。有效的動作為:-
log -
hop(僅適用於手動 WLM) -
abort -
change_query_priority(僅適用於自動 WLM)
-
以下範例顯示名為
rule_1、含有兩個述詞和hop動作之 WLM 查詢監控規則的 JSON。"rules": [ { "rule_name": "rule_1", "predicate": [ { "metric_name": "query_execution_time", "operator": ">", "value": 100000 }, { "metric_name": "query_blocks_read", "operator": ">", "value": 1000 } ], "action": "hop" } ] -
如需這些屬性和用於設定查詢佇列的策略的相關資訊,請參閱《Amazon Redshift 資料庫開發人員指南》中的實作工作負載管理。
使用 設定 WLM 參數 AWS CLI
若要設定 WLM,您必須修改 wlm_json_configuration 參數。wlm_json_configuration 屬性值的大小上限為 8000 個字元。其值使用 JavaScript 物件標記法 (JSON) 格式。如果您使用 AWS CLI、Amazon Redshift API 或其中一個 AWS SDKs 來設定 WLM,請使用本節的其餘部分來了解如何建構 wlm_json_configuration 參數的 JSON 結構。
注意
如果您使用 Amazon Redshift 主控台來設定 WLM,則不需要了解 JSON 格式,因為該主控台提供更簡單的方式來新增佇列及設定屬性。如需使用主控台來設定 WLM 的相關資訊,請參閱修改參數群組。
範例
以下範例是以自動 WLM 定義一個佇列的預設 WLM 組態。
{ "auto_wlm": true }
範例
以下範例為自訂的 WLM 組態,其定義一個並行層級 (查詢槽) 為 5 的手動 WLM 佇列。
{ "query_concurrency":5 }
語法
預設的 WLM 組態非常簡單,只有一個佇列和一個屬性。您可以新增更多佇列,並為 JSON 結構的每個佇列設定多重屬性。以下語法代表用於設定有多重屬性之多重佇列的 JSON 結構:
[ { "ParameterName":"wlm_json_configuration", "ParameterValue": "[ { "q1_first_property_name":"q1_first_property_value", "q1_second_property_name":"q1_second_property_value", ... }, { "q2_first_property_name":"q2_first_property_value", "q2_second_property_name":"q2_second_property_value", ... } ... ]" } ]
在上述範例中,開頭為 q1 的代表性屬性為第一個佇列陣列中的物件。這些物件中每個均有名稱/值對;name 和 value 共同設定了第一個佇列的 WLM 屬性。開頭為 q2 的代表性屬性為第二個佇列陣列中的物件。如果您需要更多佇列,可為其他的每個佇列新增額外的陣列,並設定各物件的屬性。
修改 WLM 組態時,即使您只需要變更佇列中的一個屬性,仍必須加入佇列的完整結構。因為整個 JSON 結構會與 wlm_json_configuration 參數值一起以字串傳入。
將 AWS CLI 命令格式化
使用 AWS CLI時,wlm_json_configuration 參數需要特定格式。使用的格式需視用戶端作業系統而定。作業系統會使用不同方式來包圍 JSON 結構,以從命令列正確傳送。如需如何在 Linux、Mac OS X 和 Windows 作業系統中建構合適命令的詳細資訊,請參閱下列各節。如需有關在 AWS CLI 中一般括住 JSON 資料結構差異的詳細資訊,請參閱AWS Command Line Interface 《 使用者指南》中的引號字串。
範例
下列命令範例為名為 example-parameter-group 的參數群組設定手動 WLM。該組態啟用短期查詢加速,短期查詢的最長執行時間設為 0,指示 WLM 動態設定數值。ApplyType 設定為 dynamic。此設定表示對參數中動態屬性進行的任何變更將立即套用,除非組態有任何其他靜態變更。該組態定義三個佇列,內容如下:
-
第一個佇列可讓使用者指定
report為佇列中的標籤 (如query_group屬性中所指定),以協助將查詢路由至該佇列。report*標籤將啟用萬用字元搜尋,因此不需要精確指定要路由至佇列的查詢。例如,reports和reporting皆符合此查詢群組。佇列將從所有佇列的總記憶體中分配到 25%,且最多可同時執行四個查詢。查詢限制的最長時間為 20000 毫秒 (ms)。模式設定為自動,因此當佇列的查詢空位已滿時,合格查詢將傳送到擴展叢集。 -
第二個佇列可讓屬於資料庫中
admin或dba群組成員的使用者將其查詢路由至佇列,以進行處理。使用者群組不可用萬用字元搜尋,因此使用者必須與資料庫中的群組精確相符,其查詢才會路由至佇列。佇列將從所有佇列的總記憶體中分配到 40%,且最多可同時執行五個查詢。模式設為關閉,因此 admin 或 dba 群組成員傳送的所有查詢都會在主要叢集上執行。 -
組態中的最後一個佇列為預設佇列。此佇列將從所有佇列的總記憶體中分配到 35%,且一次最多可處理五個查詢。模式設為自動。
注意
範例以多行顯示,做為示範之用。實際的命令不應包含分行符號。
aws redshift modify-cluster-parameter-group --parameter-group-name example-parameter-group --parameters '[ { "query_concurrency": 4, "max_execution_time": 20000, "memory_percent_to_use": 25, "query_group": ["report"], "query_group_wild_card": 1, "user_group": [], "user_group_wild_card": 0, "user_role": [], "user_role_wild_card": 0, "concurrency_scaling": "auto", "queue_type": "manual" }, { "query_concurrency": 5, "memory_percent_to_use": 40, "query_group": [], "query_group_wild_card": 0, "user_group": [ "admin", "dba" ], "user_group_wild_card": 0, "user_role": [], "user_role_wild_card": 0, "concurrency_scaling": "off", "queue_type": "manual" }, { "query_concurrency": 5, "query_group": [], "query_group_wild_card": 0, "user_group": [], "user_group_wild_card": 0, "user_role": [], "user_role_wild_card": 0, "concurrency_scaling": "auto", "queue_type": "manual" }, {"short_query_queue": true} ]'
以下是為自動 WLM 組態設定 WLM 查詢監控規則的範例。下列範例建立名為 example-monitoring-rules 的參數群組。此組態定義與先前範例中相同的三個佇列,但不再指定 query_concurrency 和 memory_percent_to_use。組態還新增了以下規則和查詢優先順序:
-
第一個佇列定義名為
rule_1的規則。規則有兩個述詞:query_cpu_time > 10000000和query_blocks_read > 1000。規則動作為log。此佇列的優先順序為Normal。 -
第二個佇列定義名為
rule_2的規則。規則有兩個述詞:query_execution_time > 600000000和scan_row_count > 1000000000。規則動作為abort。此佇列的優先順序為Highest。 -
組態中的最後一個佇列為預設佇列。此佇列的優先順序為
Low。
注意
範例以多行顯示,做為示範之用。實際的命令不應包含分行符號。
aws redshift modify-cluster-parameter-group --parameter-group-name example-monitoring-rules --parameters '[ { "query_group" : [ "report" ], "query_group_wild_card" : 1, "user_group" : [ ], "user_group_wild_card" : 0, "user_role": [ ], "user_role_wild_card": 0, "concurrency_scaling" : "auto", "rules" : [{ "rule_name": "rule_1", "predicate": [{ "metric_name": "query_cpu_time", "operator": ">", "value": 1000000 }, { "metric_name": "query_blocks_read", "operator": ">", "value": 1000 } ], "action" : "log" } ], "priority": "normal", "queue_type": "auto" }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ "admin", "dba" ], "user_group_wild_card" : 0, "user_role": [ ], "user_role_wild_card": 0, "concurrency_scaling" : "off", "rules" : [ { "rule_name": "rule_2", "predicate": [ {"metric_name": "query_execution_time", "operator": ">", "value": 600000000}, {"metric_name": "scan_row_count", "operator": ">", "value": 1000000000}], "action": "abort"}], "priority": "high", "queue_type": "auto" }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ ], "user_group_wild_card" : 0, "user_role": [ ], "user_role_wild_card": 0, "concurrency_scaling" : "auto", "priority": "low", "queue_type": "auto", "auto_wlm": true }, { "short_query_queue" : true } ]'
使用命令列 AWS CLI 中的 搭配 JSON 檔案來設定 WLM
您可以使用 AWS CLI 來修改 wlm_json_configuration 參數,並以 JSON 檔案的形式傳遞 parameters 引數的值。
aws redshift modify-cluster-parameter-group --parameter-group-name myclusterparaametergroup --parameters file://modify_pg.json
--parameters 的引數會儲存在 modify_pg.json 檔案中。檔案位置會以您的作業系統的格式指定。如需詳細資訊,請參閱從檔案載入參數。以下顯示 modify_pg.json JSON 檔案內容的範例。
[ { "ParameterName": "wlm_json_configuration", "ParameterValue": "[{\"user_group\":\"example_user_group1\",\"query_group\": \"example_query_group1\", \"query_concurrency\":7},{\"query_concurrency\":5}]" } ]
[ { "ParameterName": "wlm_json_configuration", "ParameterValue": "[{\"query_group\":[\"reports\"],\"query_group_wild_card\":0,\"query_concurrency\":4,\"max_execution_time\":20000,\"memory_percent_to_use\":25},{\"user_group\":[\"admin\",\"dba\"],\"user_group_wild_card\":1,\"query_concurrency\":5,\"memory_percent_to_use\":40},{\"query_concurrency\":5,\"memory_percent_to_use\":35},{\"short_query_queue\": true, \"max_execution_time\": 5000 }]", "ApplyType": "dynamic" } ]
在 Linux 和 macOS X 作業系統的命令列 AWS CLI 中使用 來設定 WLM 的規則
請遵循這些規則,在一行上執行具有參數的 AWS CLI 命令:
-
整個 JSON 結構必須包圍在單引號 (') 和一組括號 ([ ]) 內。
-
所有參數名稱和參數值必須包圍在雙引號 (") 內。
-
ParameterValue值內的整個巢狀結構必須包圍在雙引號 (") 和括號 ([ ]) 內。 -
巢狀結構內每個佇列的每個屬性和值必須包圍在大括號 ({ }) 內。
-
巢狀結構內的每個雙引號 (") 前必須使用反斜線 (\) 逸出字元。
-
如為名稱/值對,冒號 (:) 可分隔每個屬性與值。
-
每個名稱/值對用逗號 (,) 區隔。
-
多重佇列在佇列結束大括號 (}) 和下一個佇列起始大括號 ({) 之間用逗號 (,) 分隔。
在 Microsoft Windows 作業系統 AWS CLI 上使用 Windows PowerShell 設定 WLM 的規則
請遵循這些規則,在一行上執行具有參數的 AWS CLI 命令:
-
整個 JSON 結構必須包圍在單引號 (') 和一組括號 ([ ]) 內。
-
所有參數名稱和參數值必須包圍在雙引號 (") 內。
-
ParameterValue值內的整個巢狀結構必須包圍在雙引號 (") 和括號 ([ ]) 內。 -
巢狀結構內每個佇列的每個屬性和值必須包圍在大括號 ({ }) 內。
-
巢狀結構內的每個雙引號 (") 和其反斜線 (\) 逸出字元前必須使用反斜線 (\) 逸出字元。此需求意味著您將使用三個反斜線和一個雙引號,以確定用正確方式傳送屬性 (\\\")。
-
如為名稱/值對,冒號 (:) 可分隔每個屬性與值。
-
每個名稱/值對用逗號 (,) 區隔。
-
多重佇列在佇列結束大括號 (}) 和下一個佇列起始大括號 ({) 之間用逗號 (,) 分隔。
在 Windows 作業系統上使用命令提示設定 WLM 的規則
請遵循這些規則,在一行上執行具有參數的 AWS CLI 命令:
-
整個 JSON 結構必須包圍在雙引號 (") 和一組括號 ([ ]) 內。
-
所有參數名稱和參數值必須包圍在雙引號 (") 內。
-
ParameterValue值內的整個巢狀結構必須包圍在雙引號 (") 和括號 ([ ]) 內。 -
巢狀結構內每個佇列的每個屬性和值必須包圍在大括號 ({ }) 內。
-
巢狀結構內的每個雙引號 (") 和其反斜線 (\) 逸出字元前必須使用反斜線 (\) 逸出字元。此需求意味著您將使用三個反斜線和一個雙引號,以確定用正確方式傳送屬性 (\\\")。
-
如為名稱/值對,冒號 (:) 可分隔每個屬性與值。
-
每個名稱/值對用逗號 (,) 區隔。
-
多重佇列在佇列結束大括號 (}) 和下一個佇列起始大括號 ({) 之間用逗號 (,) 分隔。