我嘗試使用 COPY 命令將資料載入到 Amazon Redshift 的新資料表。我甚至新增了 COMPUPDATE OFF 參數。為什麼 COPY ANALYZE 仍然在執行?
簡短說明
在 Amazon Redshift 中建立資料表之前,先選取資料表的分佈樣式。如果資料表未指定分佈樣式,則預設為 AUTO 分佈。然後,Amazon Redshift 的 AUTO 分佈功能會使用 COPY ANALYZE 程序來判斷資料表是否應使用 EVEN 或 ALL 分佈。
注意: COMPUPDATE OFF 參數仍會使用 AUTO 分佈樣式對資料表執行 COPY ANALYZE。STATUPDATE OFF 參數不會停用或重新按下 COPY ANALYZE 命令。
解決方法
1. 執行 SHOW TABLE 來驗證資料表的目前分佈樣式:
SHOW TABLE [schema_name.]table_name
注意: 依預設,如果未在 CREATE TABLE 陳述式中指定分佈樣式,Amazon Redshift 會套用 AUTO 分佈。
2. 如果已開啟 AUTO 分佈,則使用已定義的分佈樣式建立資料表。指定分佈樣式可阻止 COPY ANALYZE 執行。
下列範例會指定 EVEN 分佈樣式:
create table rs_example_test (id int)diststyle even;
如需有關分佈樣式的詳細資訊,請參閱使用資料分佈樣式。
3. 使用 COPY 命令將資料載入到資料表,然後附加 STATUPDATE OFF 參數。
注意: 最佳實務是使用 COPY 命令載入大量資料,而不是使用個別 INSERT 陳述式。這可以最大限度地降低效能問題的風險。
4. 在 SVL_STATEMENTTEXT 系統資料表上執行查詢,然後依與工作階段相關的程序 ID (PID) 進行篩選:
select userid, xid, pid, trim(label) as label, starttime, endtime, sequence, trim(type) as type, left(text,60) text from svl_statementtext where pid = 26815 order by xid, starttime, sequence;
上面的語法會檢查 COPY ANALYZE 是否作為 COPY 交易的一部分執行。
輸出看起來類似下列內容:
userid xid pid label starttime endtime sequence type text
100 78915 26815 default 2019-03-19 14:06:19 2019-03-19 14:06:21 0 QUERY copy rs_test3 from 's3://xxxxx-rs-log/AWSLogs/rs_test2.csv'\
100 78915 26815 default 2019-03-19 14:06:21 2019-03-19 14:06:21 0 UTILITY COMMIT
這樣可確認 COPY ANALYZE 不再作為 COPY 交易的一部分執行。
相關資訊
使用暫存資料表執行合併 (upsert)