測試壓縮編碼 - Amazon Redshift

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

測試壓縮編碼

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

注意

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

若要執行有意義的資料壓縮測試,您必須有大量資料列。在此範例中,我們將使用從兩個資料表 VENUE和 LISTING 中選取的陳述式,來建立資料表並插入資料列。我們省略了通常會連接兩個表的 WHERE 子句。結果是 VENUE 資料表中的每個資料列都會連接至 LISTING 資料表中的所有資料列,總數超出 3 千 2 百萬個資料列。這稱為笛卡爾連接,通常不建議使用。但是,為此,這是建立許多資料列的便捷方法。如果您的現有資料表具有您要測試的資料,則可略過此步驟。

在我們有一個包含範例資料的資料表後,我們會建立一個包含七個資料欄的資料表。每個資料欄都有不同的壓縮編碼:raw、bytedict、lzo、run length、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