查詢效能改善 - Amazon Redshift

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

查詢效能改善

以下是影響 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。如需詳細資訊,請參閱檢閱查詢提醒

您也可以透過執行 識別具有資料扭曲或未排序資料列的資料表 中的查詢,查看您的查詢中是否任何資料表有大型未排序的區域。

若要修正此問題,您可以採取兩個方法:

  • 在查詢資料表上執行 VACUUM 來重新排序資料列。

  • 檢閱查詢資料表上的排序索引鍵,以查看是否有可以進行的任何改善。請記得評估此查詢的效能與其他重要查詢和整體系統的效能,再進行任何變更。如需詳細資訊,請參閱排序金鑰

次佳資料分佈

如果資料配送為次佳,您可能會看見下列:

  • 序列執行、大型廣播或大型分佈提醒事件會顯示在 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步驟中的rowsrows相比非常高。如需詳細資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視

若要修正此問題,請嘗試新增述詞至查詢,或讓現有述詞更具限制性來縮小列輸出。

非常大的結果集

如果您的查詢傳回非常大的結果集,請考慮重新寫入查詢,以使用 UNLOAD 來寫入結果至 Amazon S3。此方法利用平行處理來改善RETURN步驟的效能。如需檢查非常大型結果集的相關資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視

大型SELECT清單

如果您的查詢SELECT清單異常大,您可能會在 SVL_QUERY_ 中看到相對於任何步驟 bytes (與其他步驟相比) rows值較高的值SUMMARY。這個高 bytes 值可能是您正選取許多資料欄的指標。如需詳細資訊,請參閱使用 SVL_QUERY_SUMMARY 檢視

若要修正此問題,請檢閱您要選取的資料欄,並查看是否可移除任何項目。