測試壓縮編碼 - Amazon Redshift

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

測試壓縮編碼

如果您決定手動指定資料欄編碼,可能想要使用您的資料測試不同編碼。

注意

建議您儘可能使用 COPY 命令來載入資料,並允許 COPY 命令根據您的資料選擇最佳的編碼。或者,您可以使用ANALYZE COMPRESSION命令來檢視建議的現有資料編碼。如要套用自動壓縮的詳細資訊,請參閱利用自動壓縮載入資料表

若要執行有意義的資料壓縮測試,您需要大量資料列。在此範例中,我們會使用從兩個資料表 VENUE 和 LISTING 中選取的陳述式,來建立資料表並插入資料列。我們忽略了通常連接兩個表的 WHERE 子句。結果是行連接到所有,總共超過 3200 萬行。這稱之為笛卡兒連接,而且通常不建議這樣做。但是,基於此目的,它是建立許多資料列的便利方式。如果您的現有資料表具有您要測試的資料,則可略過此步驟。

在我們有一個包含示例數據的表後,我們創建一個包含七列的表。每個編碼都有不同的壓縮編碼:原始、Bytedict、lzo、運行長度、text255、text32k 和 zstd。我們會運行從第一個資料表中選取資料的 INSERT 命令,來使用完全相同的資料來填入每一個資料欄。

若要測試壓縮編碼,請執行下列動作:

  1. (選用) 首先,使用笛卡兒連接來建立具有大量資料列的資料表。如果您想要測試現有資料表,請略過此步驟。

    create table cartesian_venue( venueid smallint not null distkey sortkey, venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer); insert into cartesian_venue select venueid, venuename, venuecity, venuestate, venueseats from venue, listing;
  2. 接著,以您想要比較的編碼建立資料表。

    create table encodingvenue ( venueraw varchar(100) encode raw, venuebytedict varchar(100) encode bytedict, venuelzo varchar(100) encode lzo, venuerunlength varchar(100) encode runlength, venuetext255 varchar(100) encode text255, venuetext32k varchar(100) encode text32k, venuezstd varchar(100) encode zstd);
  3. 使用 INSERT 陳述式與 SELECT 子句搭配,將相同資料插入至所有資料欄。

    insert into encodingvenue select venuename as venueraw, venuename as venuebytedict, venuename as venuelzo, venuename as venuerunlength, venuename as venuetext32k, venuename as venuetext255, venuename as venuezstd from cartesian_venue;
  4. 驗證新資料表中的資料列數量。

    select count(*) from encodingvenue count ---------- 38884394 (1 row)
  5. 查詢 STV_BLOCKLIST 系統資料表,以比較每個資料欄使用的 1 MB 磁碟區塊數。

    MAX 彙總函數會傳回每個欄的最高區塊數。STV_BLOCKLIST 資料表包含三個系統產生之資料欄的詳細資訊。此範例在 WHERE 子句中使用 col < 6 來排除系統產生的資料欄。

    select col, max(blocknum) from stv_blocklist b, stv_tbl_perm p where (b.tbl=p.id) and name ='encodingvenue' and col < 7 group by name, col order by col;

    此查詢會傳回下列結果。資料欄是從零開始編號。根據您設定叢集的方式,您的結果可能具有不同號碼,但相對大小應該類似。您可以看出第二欄的 BYTEDICT 編碼產生此資料集的最佳結果。這種方法的壓縮比優於 20:1。LZO 和 ZSTD 編碼也會產生絕佳的結果。當然,不同資料集會產生不同結果。當資料欄包含更長的文字字串時,LZO 通常會產生最好的壓縮結果。

    col | max -----+----- 0 | 203 1 | 10 2 | 22 3 | 204 4 | 56 5 | 72 6 | 20 (7 rows)

如果您有現有資料表中的資料,則您可以使用 ANALYZE COMPRESSION 命令,來檢視對資料表建議的編碼。例如,下列範例顯示對 VENUE 資料表 (CARTESIAN_VENUE) 的副本建議的編碼,而此資料表包含 3 千 8 百萬個資料列。請注意,ANALYZE COMPRESSION 建議對為 VENUENAME 資料欄使用 LZO 編碼。ANALYZE COMPRESSION 根據多個因素 (包含減少百分比) 選擇最佳的壓縮。在此特定的情況下,BYTEDICT 提供更好的壓縮,但 LZO 也會產生大於 90% 的壓縮。

analyze compression cartesian_venue; Table | Column | Encoding | Est_reduction_pct ---------------+------------+----------+------------------ reallybigvenue | venueid | lzo | 97.54 reallybigvenue | venuename | lzo | 91.71 reallybigvenue | venuecity | lzo | 96.01 reallybigvenue | venuestate | lzo | 97.68 reallybigvenue | venueseats | lzo | 98.21