使用短期查詢加速 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用短期查詢加速

短期查詢加速 (SQA) 可排定讓短期執行的查詢優先於長期執行的查詢。SQA 會在專用空間中執行短期查詢,所以 SQA 查詢不會被迫在佇列中排在長期查詢後面等待。SQA 只優先處理短期執行且位於使用者定義佇列中的查詢。SQA 可讓短期執行的查詢更快開始執行,使用者會更快看到結果。

如果啟用 SQA,您可以減少或去除短期查詢執行專用的工作負載管理 (WLM) 佇列。此外,長期執行的查詢不需要與短期查詢爭奪佇列中的槽,因此,您可以將 WLM 佇列設定為使用較少的查詢槽。使用較低的並行性時,就大部分工作負載而言,查詢傳輸量會增加,且整體系統效能會改善。

CREATE TABLE AS (CTAS) 陳述式和唯讀查詢 (例如 SELECT 陳述式) 符合 SQA 的資格。

Amazon Redshift 使用機器學習算法來分析每個合格查詢,並預測查詢的執行時間。根據預設,WLM 會根據叢集工作負載的分析結果,動態指派 SQA 最長執行時間的值。或者,您可以指定固定值 1—20 秒。在某些情況下,查詢的預期執行時間可能比已定義的 SQA 最長執行時間更短。在這些情況下,查詢需要在佇列中等待。在此,SQA 會使查詢脫離 WLM 佇列,並排定為優先執行。如果查詢執行的時間比 SQA 最長執行時間還久,WLM 會根據 WLM 佇列指派規則,將查詢移至第一個相符的 WLM 佇列。隨著 SQA 從查詢模式中學習一段時間,預測會越準確。

根據預設,SQA 在預設參數群組中會啟用,且適用於所有新的參數群組。若要在 Amazon Redshift 主控台停用 SQA,請編輯參數叢集的 WLM 組態,並取消選取啟用短期查詢加速。在最佳作法上,建議使用的 WLM 查詢槽計數為 15 或更少,以維持最佳的整體系統效能。如需修改 WLM 組態的相關資訊,請參設定工作負載管理中的Amazon Redshift 叢集管理指南

短期查詢最長執行時間

啟用 SQA 時,根據預設,WLM 會將短期查詢的最長執行時間設為動態。建議維持 SQA 最長執行時間的動態設定。您可以指定固定值 1—20 秒以覆寫預設設定。

在某些情況下,您可能考慮針對 SQA 最長執行時間值使用不同的值,以改善系統效能。在此情況下,請分析工作負載,以找出大部分短期執行查詢的最長執行時間。下列查詢傳回第 70 個百分位數附近之查詢的最長執行時間。

select least(greatest(percentile_cont(0.7) within group (order by total_exec_time / 1000000) + 2, 2), 20) from stl_wlm_query where userid >= 100 and final_state = 'Completed';

決定適合工作負載的最長執行時間值之後,就不需要變更,除非工作負載大幅改變。

監控 SQA

若要檢查是否已啟用 SQA,請執行下列查詢。如果查詢傳回一列,表示 SQA 已啟用。

select * from stv_wlm_service_class_config where service_class = 14;

下列查詢顯示通過每個查詢佇列 (服務類別) 的查詢數。也顯示平均執行時間、第 90 個百分位數的查詢數和等待時間,以及平均等待時間。SQA 查詢使用服務類別 14。

select final_state, service_class, count(*), avg(total_exec_time), percentile_cont(0.9) within group (order by total_queue_time), avg(total_queue_time) from stl_wlm_query where userid >= 100 group by 1,2 order by 2,1;

若要找出哪些查詢由 SQA 挑出且成功完成,請執行下列查詢。

select a.queue_start_time, a.total_exec_time, label, trim(querytxt) from stl_wlm_query a, stl_query b where a.query = b.query and a.service_class = 14 and a.final_state = 'Completed' order by b.query desc limit 5;

若要找出由 SQA 挑出但逾時的查詢,請執行下列查詢。

select a.queue_start_time, a.total_exec_time, label, trim(querytxt) from stl_wlm_query a, stl_query b where a.query = b.query and a.service_class = 14 and a.final_state = 'Evicted' order by b.query desc limit 5;