Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何對 Amazon Redshift 磁碟使用率過高或已滿的問題進行疑難排解?
我在 Amazon Redshift 上遇到磁碟使用率過高或已滿的情況,並且想要對此問題進行疑難排解。
解決方法
若要解決 Amazon Redshift 的磁碟使用率過高或磁碟已滿的問題,請依照以下疑難排解步驟進行。
分佈和排序索引鍵
檢閱資料表的分佈樣式、分佈索引鍵和排序索引鍵選擇。分佈偏態的資料表可能會導致磁碟節點已滿。如果您的資料表具有偏態的分佈樣式,請將分佈樣式變更為更均勻的分佈。在查詢執行時,分佈和資料列偏態可能會影響儲存偏態和中繼資料列集。
若要取得分佈索引鍵的基數,請執行下列查詢:
SELECT <distkey column>, COUNT(*) FROM <schema name>.<table with distribution skew> GROUP BY <distkey column> HAVING COUNT(*) > 1 ORDER BY 2 DESC;
注意:將 distkey 資料欄、結構描述名稱以及具有分佈偏態的資料表替換為您自己的資料表變數。
若要避免排序步驟,請在 ORDER BY 子句中使用 SORT KEY 資料欄。排序步驟可能會使用過多的記憶體,並造成磁碟溢出。如需更多資訊,請參閱排序索引鍵。
在篩選的結果集中,選擇具有高基數的資料欄以檢視資料分佈。如需更多資訊,請參閱選擇最佳分佈樣式。
查詢處理
檢查已配置的查詢記憶體。在處理查詢時,中間查詢結果可能會存放在暫存區塊中。如果沒有足夠的可用記憶體,則資料表會導致磁碟溢出。中繼結果集不會壓縮,這會影響可用的磁碟空間。如需詳細資訊,請參閱配置給查詢的記憶體不足。
Amazon Redshift 預設為具有均勻分佈,且暫存資料表沒有資料欄編碼的資料表結構。如果您使用的是 SELECT...INTO 語法,請使用 CREATE 陳述式。如需詳細資訊,請參閱 Amazon Redshift 的 10 大效能調整技術中的 秘訣 #6。
如果為查詢配置的記憶體不足,您可能會在 SVL_QUERY_SUMMARY 中看到一個步驟,其中 is_diskbased 顯示值 true。以下查詢可識別指定時間的前 20 個磁碟溢出查詢:
SELECT q.userid, q.query, q.starttime, q.endtime, m.query_temp_blocks_to_disk, btrim(querytxt) FROM stl_query q JOIN SVL_QUERY_METRICS_SUMMARY m ON m.query = q.query WHERE m.query_temp_blocks_to_disk > 0 AND starttime BETWEEN '2025-01-01 00:00:00' AND '2025-01-02 00:00:00' ORDER BY m.query_temp_blocks_to_disk DESC LIMIT 20;
若要解決此問題,請增加查詢插槽的數量,以向查詢配置更多記憶體。
如果您注意到使用率突然激增,請執行以下查詢來識別前 20 個磁碟溢出查詢:
SELECT a.userid, a.query, a.blocks_to_disk, trim(b.text) as text FROM stv_query_metrics a, stv_inflight b WHERE a.query = b.query AND a.segment = -1 AND a.step_type = -1 AND a.max_blocks_to_disk > 0 ORDER BY 3 DESC LIMIT 20;
在輸出中,查看 blocks_to_disk 資料欄值以識別磁碟溢出。終止溢出過多的查詢,然後在重新執行前配置更多記憶體給這些查詢。
您也可以使用 WLM 查詢監控規則來應對繁重的處理負載,並識別 I/O 密集型查詢。
具有 VARCHAR(MAX) 資料欄的資料表
檢查 VARCHAR 或 CHARACTER VARYING 資料欄中是否有結尾空白,當資料儲存在磁碟上時,這些空白可能會省略。在處理查詢時,尾端空格可能在記憶體中佔用完整長度。VARCHAR 與 CHARACTER VARYING 的最大值為 65535 位元組。最佳實務是使用盡可能小的資料欄大小。
若要產生最大資料欄寬的資料表清單,請執行下列查詢:
SELECT database, schema || '.' || "table" AS "table", max_varchar FROM svv_table_info WHERE max_varchar > 150 ORDER BY 2;
執行行以下查詢,以識別並顯示寬 VARCHAR 資料表資料欄的實際寬度:
SELECT max(octet_length (rtrim(column_name))) FROM table_name;
在查詢輸出中,確認長度是否符合您的使用需求。如果資料欄達到最大長度並超出您的需求,請將長度調整為所需的大小下限。
如需詳細資訊,請參閱 Amazon Redshift 資料表設計最佳實務。
高資料欄壓縮
若要編碼除排序索引鍵外的所有資料欄,請使用分析壓縮或自動資料表最佳化。最佳實務是使用資料欄編碼。
維護操作
務必定期分析並清理 Amazon Redshift 資料庫中的資料表。識別針對缺少統計資料的資料表執行的任何查詢。然後,防止查詢針對缺少統計資料的資料表執行,以避免 Amazon Redshift 掃描不必要的資料表列。
**注意:**VACUUM 和 DEEP COPY 等維護操作會使用暫儲存存空間進行排序操作,可能導致磁碟用量激增。
例如,以下查詢可識別 Amazon Redshift 中過時的統計資料:
SELECT table_id, database, schema, "table", stats_off, size FROM svv_table_info WHERE stats_off > 10 ORDER BY size DESC;
此外,使用 ANALYZE 命令來檢視和分析資料表統計資料。
具有交叉聯結的笛卡爾乘積
使用查詢的 EXPLAIN 計畫來尋找笛卡爾乘積的查詢。笛卡爾乘積是不相關的交叉聯結,可能增加區塊數量。這些交叉聯結可能會導致更高的記憶體使用率,以及更多資料表溢出至磁碟。如果交叉聯結不共用 JOIN 條件,則聯結會產生兩個資料表的笛卡爾乘積。一個資料表的每個資料列會聯結至另一個資料表的每個資料列。
交叉聯結也可能以巢狀迴圈聯結執行,導致處理時間過長。巢狀迴圈聯結會導致整體磁碟用量激增。如需更多資訊,請參閱識別具有巢狀迴圈的查詢。
最小資料表大小
個別資料表在不同叢集中的大小可能不同。資料表大小下限由資料欄數以及資料表是否具有 SORTKEY 和填入的磁碟切片數量來確定。如果您最近調整過 Amazon Redshift 叢集大小,可能會看到因切片變化而導致整體磁碟儲存量變化。Amazon Redshift 也會計算每個資料表使用的資料表區段。如需更多資訊,請參閱為什麼 Amazon Redshift 叢集中的資料表耗用的磁碟儲存空間超過預期或更少?
標記區塊
當對 Amazon Redshift 資料表執行 WRITE 交易且有同時讀取操作時,會生成標記區塊。Amazon Redshift 會在寫入操作之前保留區塊,以保持並行讀取操作的一致性。您無法更改 Amazon Redshift 的區塊。每次插入、更新或刪除動作都會建立一組新的區塊,並將舊區塊標示為已標記。
有時,由於長時間執行的資料表交易,因此標記無法在認可階段清除。當有太多 ETL 負載同時執行時,標記也可能無法清除。由於 Amazon Redshift 會從交易開始時監控資料庫,因此寫入資料庫的任何資料表也會保留標記區塊。如果長時間執行的資料表交易經常發生在多個負載中,則可能會累積足夠的標記,導致「磁碟已滿」錯誤。
如果有長時間執行的查詢正在執行,請執行 commit 命令以終止查詢,並釋放所有後續區塊:
begin; create table a (id int); insert into a values(1); commit; drop table a;
執行以下查詢以確認標記區塊:
SELECT trim(name) as tablename, count(case when tombstone > 0 then 1 else null end) as tombstones FROM svv_diskusage GROUP BY 1 HAVING count(case when tombstone > 0 then 1 else null end) > 0 ORDER BY 2 DESC;
複製大型檔案
即使有足夠的儲存空間,COPY 操作也可能收到「Disk Fulll error」錯誤。如果排序操作溢出至磁碟並建立暫存區塊,則會發生此錯誤。
如果遇到「Disk Full」錯誤,請檢查 STL_DISK_FULL_DIAG 資料表。檢查暫存區塊及引發錯誤的查詢 ID:
SELECT '2000-01-01'::timestamp + (currenttime/1000000.0)* interval '1 second' as currenttime, node_num, query_id, temp_blocks FROM stl_disk_full_diag;
如需更多資訊,請參閱 Amazon Redshift 載入資料最佳實務。
消費者叢集上的 Datashare 查詢區塊
當資料共用查詢在消費者叢集執行時,與該查詢相關的資料區塊會計入 PercentageDiskSpaceUsed 指標。由於叢集重新啟動及其他因素,這些資料區塊會從 PercentageDiskSpaceUsed 指標中移除。對於此預期行為,無需進一步操作。
檢查磁碟空間
在 Amazon Redshift 主控台的 Performance (效能) 索引標籤下,檢查磁碟空間百分比。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 3 年前