本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
利用自動壓縮載入資料表
您可以根據自己對資料的評估,將壓縮編碼手動套用至資料表中的資料欄。或者,您可以使用 COPY 命令,搭配使用設為 ON 的 COMPUPDATE,根據範例資料自動分析並套用壓縮。
您可以在建立和載入全新資料表時使用自動壓縮。COPY 命令會執行壓縮分析。藉由在已填入的資料表上執行 ANALYZE COMPRESSION 命令,您也可以執行壓縮分析,而不載入資料或變更資料表上的壓縮。例如,當您想要在資料表上分析壓縮以供日後使用,同時保留現有的資料定義語言 (DDL) 陳述式時,您可以執行 ANALYZE COMPRESSION。
選擇壓縮編碼時,自動壓縮會平衡整體效能。如果排序索引鍵欄位的壓縮比相同查詢中的其他欄位高出許多,限制範圍的掃描執行效果可能較差。因此,自動壓縮將跳過排序索引鍵資料欄上的資料分析階段,並保留使用者定義的編碼類型。
如果您尚未明確定義編碼類型,自動壓縮會選擇 RAW 編碼。ANALYZE COMPRESSION 有相同的行為。為了獲得最佳的查詢效能,請考慮針對排序索引鍵使用 RAW。
自動壓縮的運作方式
將 COMPUPDATE 參數設為 ON 時,每當您對空白的目標資料表執行 COPY 命令,且所有資料表資料欄都是 RAW 編碼或無編碼時,COPY 命令會套用自動壓縮。
若要對空白資料表套用自動壓縮,而不論其目前的壓縮編碼,請在執行 COPY 命令時將 COMPUPDATE 選項設為 ON。若要關閉自動壓縮,請在執行 COPY 命令時將 COMPUPDATE 選項設為 OFF。
您不可以套用自動壓縮至已包含資料的資料表。
注意
自動壓縮分析需要在載入資料中有足夠的資料列 (每個配量至少 100,000 資料列),才能產生有意義的樣本。
自動壓縮會隨著載入交易在背景中執行這些操作:
-
從輸入檔案載入初始的資料列樣本。樣本大小是基於 COMPROWS 參數的值。預設為 100,000。
-
為每個資料欄選擇壓縮選項。
-
樣本資料列從資料表移除。
-
以所選壓縮編碼重新建立資料表。
-
使用新編碼載入和壓縮整個輸入檔案。
執行 COPY 命令之後,資料表會完整載入、壓縮和可供使用。如果您稍後載入更多資料,附加的資料列會根據現有編碼壓縮。
如果您只想要執行壓縮分析,請執行 ANALYZE COMPRESSION,這較執行完整 COPY 更有效率。然後您可以評估結果來決定是否使用自動壓縮或手動重新建立資料表。
自動壓縮僅支援 COPY 命令。另外,您可以在建立資料表時手動套用壓縮編碼。如需手動壓縮編碼的詳細資訊,請參閱資料欄壓縮以減少儲存資料的大小。
自動壓縮範例
在此範例中,假設 TICKIT 資料庫包含 LISTING 資料表的複本 (名為 BIGLIST),而您想要在載入大約 300 萬個資料列時套用自動壓縮至此資料表。
載入和自動壓縮資料表
-
確保資料表是空白的。您僅可以套用自動壓縮至空白資料表:
TRUNCATE biglist;
-
以單一 COPY 命令載入資料表。雖然資料表是空白的,可能已指定部分較舊的編碼。若要促使 Amazon Redshift 執行壓縮分析,請將 COMPUPDATE 參數設定為 ON。
COPY biglist FROM 's3://amzn-s3-demo-bucket/biglist.txt' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' DELIMITER '|' COMPUPDATE ON;
因為沒有指定 COMPROWS 選項,會使用每個配量 100,000 個資料列的預設和建議樣本大小。
-
查看 BIGLIST 資料表的新結構描述,以便檢閱自動選擇的編碼結構。
SELECT "column", type, encoding from pg_table_def where tablename = 'biglist';
Column | Type | Encoding ----------------+-----------------------------+---------- listid | integer | az64 sellerid | integer | az64 eventid | integer | az64 dateid | smallint | none numtickets | smallint | az64 priceperticket | numeric(8,2) | az64 totalprice | numeric(8,2) | az64 listtime | timestamp without time zone | az64
-
驗證已載入預期的資料列數量:
select count(*) from biglist;
count --------- 3079952 (1 row)
稍後使用 COPY 或 INSERT 陳述式將資料列附加至此資料表時,會套用相同的壓縮編碼。