本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
測試壓縮編碼
如果您決定手動指定資料欄編碼,可能想要使用您的資料測試不同編碼。
注意
我們建議您盡可能使用 COPY命令載入資料,並允許 COPY命令根據您的資料選擇最佳編碼。或者,您可以使用 ANALYZE COMPRESSION 命令,來檢視對現有資料建議的編碼。如要套用自動壓縮的詳細資訊,請參閱利用自動壓縮載入資料表。
若要執行有意義的資料壓縮測試,您必須有大量資料列。在此範例中,我們使用從兩個資料表中選取的陳述式來建立資料表並插入資料列;VENUE以及 LISTING。我們會捨棄通常會聯結兩個資料表的WHERE子句。結果是VENUE資料表中的每個資料列都會聯結到LISTING資料表中的所有資料列,總計超過 3,200 萬資料列。這稱為笛卡爾連接,通常不建議使用。但是,為此,這是建立許多資料列的便捷方法。如果您的現有資料表具有您要測試的資料,則可略過此步驟。
在我們有一個包含範例資料的資料表後,我們會建立一個包含七個資料欄的資料表。每個資料欄都有不同的壓縮編碼:raw、bytedict、lzo、run length、text255、text32k 和 zstd。我們會執行從第一個資料表中選取資料的INSERT命令,將完全相同的資料填入每個資料欄。
若要測試壓縮編碼,請執行以下動作:
-
(選用) 首先,使用笛卡兒連接來建立一個具有大量資料列的資料表。如果您想要測試現有資料表,請略過此步驟。
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;
-
接著,以您想要比較的編碼建立資料表。
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);
-
使用具有SELECT子句的INSERT陳述式,將相同的資料插入所有資料欄。
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;
-
驗證新資料表中的資料列數量。
select count(*) from encodingvenue count ---------- 38884394 (1 row)
-
查詢 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,800 萬列。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
範例
下列範例會建立資料表,CUSTOMER其中包含具有各種資料類型的資料欄。此CREATETABLE陳述式顯示這些資料欄的許多可能的壓縮編碼組合之一。
create table customer( custkey int encode delta, custname varchar(30) encode raw, gender varchar(7) encode text255, address varchar(200) encode text255, city varchar(30) encode text255, state char(2) encode raw, zipcode char(5) encode bytedict, start_date date encode delta32k);
下表顯示為CUSTOMER資料表選取的資料欄編碼,並提供選項的說明:
資料行 | 資料類型 | 編碼 | 說明 |
---|---|---|---|
CUSTKEY | int | delta | CUSTKEY 由唯一的連續整數值組成。由於差異是 1 位元組,DELTA因此是不錯的選擇。 |
CUSTNAME | varchar(30) | raw | CUSTNAME 有一個具有少數重複值的大型網域。任何壓縮編碼通常可能成效不佳。 |
GENDER | varchar(7) | text255 | GENDER 是具有許多重複值的極小網域。Text255 與重複出現相同字詞的資料VARCHAR欄運作良好。 |
ADDRESS | varchar(200) | text255 | ADDRESS 是一個大型網域,但包含許多重複的單字,例如街道、大道、北部、南部等。文字 255 和文字 32k 有助於壓縮重複出現相同字詞的資料VARCHAR欄。資料欄長度很短,因此 text255 是個好選擇。 |
CITY | varchar(30) | text255 | CITY 是一個大型網域,具有一些重複值。特定城市名稱比其他城市名稱更常使用。Text255 是不錯的選擇,原因與 相同ADDRESS。 |
STATE | char(2) | raw | 在美國, STATE 是 50 個雙字元值的精確網域。Bytedict 編碼將產生一些壓縮,但是因為資料欄大小只是兩個字元,所以壓縮可能不值得解除壓縮資料的額外負荷。 |
ZIPCODE | char(5) | bytedict | ZIPCODE 是少於 50,000 個唯一值的已知網域。特定郵遞區號比其他郵遞區號更常出現。當資料欄包含有限數目的唯一值時,Bytedict 編碼很有效。 |
START_DATE | date | delta32k | Delta 編碼對日期時間資料欄很有用,尤其是在資料列依日期順序載入時。 |