本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
查詢效能改善
以下是影響 Amazon Redshift 查詢效能的一些常見問題,其中包含診斷和解決方法的說明。
資料表統計資訊遺漏或過時
如果資料表統計資料遺漏或過時,您可能會看見下列:
-
EXPLAIN 命令中的警告訊息會產生。
-
STL_ALERT_EVENT_ 中遺失統計資料警示事件LOG。如需詳細資訊,請參閱檢閱查詢提醒。
若要修正此問題,請執行 ANALYZE。
巢狀迴圈
如果存在巢狀迴圈,您可能會在 STL_ALERT_EVENT_ 中看到巢狀迴圈警示事件LOG。您也可以透過執行識別具有巢狀迴圈的查詢中的查詢,來識別此類型的事件。如需詳細資訊,請參閱檢閱查詢提醒。
若要修正此問題,請檢閱您的查詢以取得交叉聯結並在可能時加以移除。交叉聯結是沒有聯結條件的聯結,會造成兩個資料表的笛卡兒乘積。它們通常會以巢狀迴圈聯結的形式執行,這是可能的聯結類型中最慢的。
雜湊聯結
如果出現雜湊聯結,您可能會看見下列:
-
查詢計畫中的雜湊和雜湊聯結操作。如需詳細資訊,請參閱分析查詢計劃。
-
在 SVL_QUERY_ 中具有最高最長時間值的區段中的HJOIN步驟SUMMARY。如需詳細資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視。
若要修正此問題,您可以採取兩個方法:
-
如果可能,重新寫入查詢以使用合併聯結。指定同時為散發索引鍵和排序索引鍵的聯結資料欄即可執行此動作。
-
如果 SVL_QUERY_SUMMARY 中的HJOIN步驟與查詢中最後一個RETURN步驟中的資料列值相比,資料列欄位中的值非常高,請檢查是否可以重寫查詢以在唯一資料欄上聯結。當查詢未在唯一資料欄上聯結時,例如主要索引鍵,它會增加聯結中牽涉的資料列數量。
幽靈資料列或未遞交的資料列
如果存在 ghost 資料列或未認可資料列,您可能會在 STL_ALERT_EVENT_LOG 中看到警示事件,指出過度的 ghost 資料列。如需詳細資訊,請參閱檢閱查詢提醒。
若要修正此問題,您可以採取兩個方法:
-
查看 Amazon Redshift 主控台的載入索引標籤,以瞭解任何查詢資料表上的作用中載入操作。如果您看見作用中的載入操作,採取動作之前,請等候那些操作完成。
-
如果沒有作用中載入操作,請在查詢資料表上執行 VACUUM 來移除刪除的資料列。
未排序或排序錯誤的資料列
如果存在未排序或錯誤列,您可能會在 STL_ALERT_EVENT_ 中看到非常選擇性的篩選條件警示事件LOG。如需詳細資訊,請參閱檢閱查詢提醒。
您也可以透過執行 識別具有資料扭曲或未排序資料列的資料表 中的查詢,查看您的查詢中是否任何資料表有大型未排序的區域。
若要修正此問題,您可以採取兩個方法:
次佳資料分佈
如果資料配送為次佳,您可能會看見下列:
-
序列執行、大型廣播或大型分佈提醒事件會顯示在 STL_ALERT_EVENT_ 中LOG。如需詳細資訊,請參閱檢閱查詢提醒。
-
針對指定步驟,配量未處理大約相同數量的資料列。如需詳細資訊,請參閱使用 SVL_QUERY_REPORT 檢視。
-
針對指定步驟,配量未耗費大約相同的時間量。如需詳細資訊,請參閱使用 SVL_QUERY_REPORT 檢視。
如果前述中無一成立,您也可以透過執行 識別具有資料扭曲或未排序資料列的資料表 中的查詢,查看您的查詢中是否有任何資料表有資料偏度。
若要修正此問題,查看查詢中資料表的分佈樣式,並確認是否可以進行任何改善。請記得評估此查詢的效能與其他重要查詢和整體系統的效能,再進行任何變更。如需詳細資訊,請參閱查詢最佳化的資料分佈。
配置給查詢的記憶體不足
如果分配給查詢的記憶體不足,您可能會在 SVL_QUERY_SUMMARY 中看到is_diskbased
一個值為 true 的步驟。如需詳細資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視。
若要修正此問題,請透過暫時增加它所使用查詢位置的數量,為查詢配置更多記憶體。Workload Management (WLM) 會保留查詢佇列中的插槽,等同於為佇列設定的並行層級。例如,具有並行層級 5 的佇列有 5 個位置。指派給佇列的記憶體會平均配置到每個位置。對一個查詢指派數個位置可讓該查詢存取所有那些位置的記憶體。如需如何暫時增加查詢位置的相關資訊,請參閱wlm_query_slot_count。
次佳WHERE子句
如果您的WHERE子句導致過度掃描資料表,您可能會在 區段中看到一個SCAN步驟,其maxtime
值最高為 SVL_QUERY_SUMMARY。如需詳細資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視。
若要修正此問題,請根據最大資料表的主要排序資料欄,將WHERE子句新增至查詢。這種方法可縮短降低掃描時間。如需詳細資訊,請參閱設計資料表的 Amazon Redshift 最佳實務。
不足的限制性述詞
如果您的查詢具有限制性不足的述詞,您可能會在 SVL_QUERY_SUMMARY 中看到具有最高maxtime
值的區段中,該SCAN值與查詢中最後一個RETURN步驟中的rows
值rows
相比非常高。如需詳細資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視。
若要修正此問題,請嘗試新增述詞至查詢,或讓現有述詞更具限制性來縮小列輸出。
非常大的結果集
如果您的查詢傳回非常大的結果集,請考慮重新寫入查詢,以使用 UNLOAD 來寫入結果至 Amazon S3。此方法利用平行處理來改善RETURN步驟的效能。如需檢查非常大型結果集的相關資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視。
大型SELECT清單
如果您的查詢SELECT清單異常大,您可能會在 SVL_QUERY_ 中看到相對於任何步驟 bytes
(與其他步驟相比) rows
值較高的值SUMMARY。這個高 bytes
值可能是您正選取許多資料欄的指標。如需詳細資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視。
若要修正此問題,請檢閱您要選取的資料欄,並查看是否可移除任何項目。