選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

測試壓縮編碼 - 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

範例

下列範例會建立具有各種資料類型資料欄的 CUSTOMER 資料表。此 CREATE TABLE 陳述式會為這些資料欄顯示壓縮編碼的許多可能組合的其中一個。

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 包含唯一連續的整數值。因為差異將為一個位元組,所以 DELTA 是個好選擇。
CUSTNAME varchar(30) raw CUSTNAME 具有重複值只有幾個的大型網域。任何壓縮編碼通常可能成效不佳。
GENDER varchar(7) text255 GENDER 是重複值很多的超小型網域。Text255 很適合用於相同單字重複出現的 VARCHAR 資料欄。
ADDRESS varchar(200) text255 ADDRESS 是大型網域,但包含許多重複單字,例如 Street Avenue、North、South 等等。Text 255 和 text 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 編碼對日期時間資料欄很有用,尤其是在資料列依日期順序載入時。

下一個主題:

資料分佈

上一個主題:

壓縮編碼
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。