壓縮編碼 - Amazon Redshift

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

壓縮編碼

壓縮編碼會指定在資料列新增至資料表時,套用至一欄資料值的壓縮類型。

ENCODE AUTO 是資料表的預設值。當資料表設定為 ENCODE 時AUTO,Amazon Redshift 會自動管理資料表中所有資料欄的壓縮編碼。如需詳細資訊,請參閱 CREATE TABLEALTER TABLE

不過,如果您為資料表中的任何資料欄指定壓縮編碼,則資料表將不再設定為 ENCODE AUTO。Amazon Redshift 不再自動管理資料表中所有資料欄的壓縮編碼。

當您使用 CREATE 時TABLE,當您為資料表中的任何資料欄指定壓縮編碼時, ENCODE AUTO 會停用。如果 ENCODE AUTO 已停用,Amazon Redshift 會自動將壓縮編碼指派給您未指定ENCODE類型的資料欄,如下所示:

  • 定義為排序索引鍵的資料欄會被指派RAW壓縮。

  • 定義為 BOOLEAN、 REAL或 DOUBLE PRECISION 資料類型的資料欄會被指派RAW壓縮。

  • 定義為 SMALLINT、INTEGER、、BIGINT、DECIMALDATE、 TIMESTAMP或 TIMESTAMPTZ資料類型的資料欄會被指派AZ64壓縮。

  • 定義為 CHAR或 VARCHAR 資料類型的資料欄會被指派LZO壓縮。

您可以使用 來變更資料表的編碼ALTERTABLE。如果您ENCODEAUTO使用 ALTER 停用 TABLE,Amazon Redshift 將不再自動管理資料欄的壓縮編碼。在您變更壓縮編碼類型或ENCODEAUTO再次啟用ENCODEAUTO之前,所有資料欄都會保留其在停用時擁有的壓縮編碼類型。

Amazon Redshift 支援下列壓縮編碼:

Raw

原始編碼是指定為排序索引鍵的資料欄的預設編碼REAL,以及定義為 BOOLEAN、 或 DOUBLEPRECISION資料類型的資料欄。系統使用 Raw 編碼,以原始、未壓縮格式來儲存資料。

AZ64

AZ64 是由 Amazon 設計的專有壓縮編碼演算法,可實現高壓縮率並改善查詢處理。該AZ64演算法的核心會壓縮較小的資料值群組,並使用單一指令、多個資料 (SIMD) 指令進行平行處理。使用 AZ64 可大幅節省儲存成本,並針對數值、日期和時間資料類型提供高效能。

您可以使用 AZ64作為壓縮編碼,使用 CREATETABLE和 ALTERTABLE陳述式定義具有下列資料類型的資料欄:

  • SMALLINT

  • INTEGER

  • BIGINT

  • DECIMAL

  • DATE

  • TIMESTAMP

  • TIMESTAMPTZ

Byte-dictionary

在 byte dictionary 編碼中,唯一值的個別字典是針對磁碟上資料欄值的每個區塊而建立的。(Amazon Redshift 磁碟會佔用 1 MB。) 字典最多可包含 256 個一元位元組值,其會以索引形式儲存至原始資料值。如果在單一區塊中儲存超過 256 個值,則額外的值會以原始、未壓縮格式寫入至區塊。對於每個磁碟區塊都會重複此程序。

這種編碼對低基數字串資料欄非常有效。當資料欄的資料網域少於 256 個唯一值時,這是最佳的編碼。

對於使用 編碼的字串資料類型 (CHAR 和 VARCHAR) 的資料欄BYTEDICT,Amazon Redshift 會執行直接透過壓縮資料操作的向量化掃描和述詞評估。這些掃描使用硬體特定的單一指令和多個資料 (SIMD) 指令進行平行處理。這會顯著加快字串資料欄的掃描速度。如果 CHAR/VARCHAR 資料欄包含長字元字串,則位元組字典編碼會特別節省空間。

假設資料表具有具有 CHAR(30) 資料類型的資料COUNTRY欄。載入資料時,Amazon Redshift 會建立字典,並將索引值填入資料COUNTRY欄。字典包含已建立索引的唯一值,而且資料表本身只包含對應值的一位元組下標。

注意

會儲存固定長度字元欄的多餘空格。因此,在 CHAR(30) 欄中,當您使用位元組字典編碼時,每個壓縮值都會節省 29 個位元組的儲存。

下表代表COUNTRY資料欄的字典。

唯一資料值 字典索引 大小 (固定長度,每個值 30 個位元組)
England 0 30
United States of America 1 30
Venezuela 2 30
Sri Lanka 3 30
Argentina 4 30
Japan 5 30
合計 180

下表代表COUNTRY欄中的值。

原始資料值 原始大小 (固定長度,每個值 30 個位元組) 壓縮值 (索引) 新大小 (位元組)
England 30 0 1
England 30 0 1
United States of America 30 1 1
United States of America 30 1 1
Venezuela 30 2 1
Sri Lanka 30 3 1
Argentina 30 4 1
Japan 30 5 1
Sri Lanka 30 3 1
Argentina 30 4 1
合計 300 10

此範例中的合計壓縮大小計算如下:6 個不同項目儲存在字典 (6 * 30 = 180),而且資料表包含 10 個 1 位元組壓縮值,合計 190 個位元組。

Delta

Delta 編碼對日期時間欄很有用。

Delta 藉由記錄資料欄中彼此跟隨的值之間的差異來壓縮資料。此差異會記錄在磁碟上資料欄值之每個區塊的個別字典中。(Amazon Redshift 磁碟會佔用 1 MB。) 例如,假設資料欄包含 10 個整數,順序從 1 到 10。第一個會儲存為 4 位元組整數 (加上 1 位元組旗標)。接下來的九個會分別儲存為值為 1 的位元組,表示比前一個值多 1。

Delta 編碼附有兩個變異:

  • DELTA 會將差異記錄為 1 位元組值 (8 位元整數)

  • DELTA32K 將差異記錄為 2 位元組值 (16 位元整數)

如果資料欄中的大多數值可以透過使用單一位元組進行壓縮,則 1 位元組的變化非常有效。但是,如果差異較大,則此編碼 (在最壞的情況下) 會比儲存未壓縮資料的效果差。類似邏輯適用於 16 位元版本。

如果兩個值之間的差異超過 1 位元組範圍 (DELTA) 或 2 位元組範圍 (DELTA32K),則會儲存完整的原始值,並帶有 1 位元組開頭的旗標。1 位元組範圍從 -127 到 127,而 2 位元組範圍從 -32K 到 32K。

下表顯示數值欄的 Delta 編碼如何運作。

原始資料值 原始大小 (位元組) 差異 (delta) 壓縮值 壓縮大小 (位元組)
1 4 1 1+4 (旗標 + 實際值)
5 4 4 4 1
50 4 45 45 1
200 4 150 150 1+4 (旗標 + 實際值)
185 4 -15 -15 1
220 4 35 35 1
221 4 1 1 1
合計 28 15
LZO

LZO 編碼提供非常高的壓縮比率,並具有良好的效能。LZO 編碼對存放非常長字元字串的 CHAR和 VARCHAR資料欄尤其有效。它們特別適用於自由格式文字,例如產品描述、使用者評論或JSON字串。

Mostly

當資料欄的資料類型大於大部份儲存值所需的資料類型時,Mostly 編碼很有用。您可以對此類型的資料欄指定 mostly 編碼,將資料欄中的大部分值壓縮為更小的標準儲存空間大小。剩下無法壓縮的值會以其原始格式儲存。例如,您可以將 16 位元資料欄,例如資料INT2欄,壓縮為 8 位元儲存。

通常,mostly 編碼會使用下列資料類型:

  • SMALLINT/INT2 (16 位元)

  • INTEGER/INT (32 位元)

  • BIGINT/INT8 (64 位元)

  • DECIMAL/NUMERIC (64 位元)

選擇 mostly 編碼的適當變異來符合資料欄之資料類型的大小。例如,MOSTLY8套用至定義為 16 位元整數資料欄的資料欄。不允許套用至 16 位元資料類型MOSTLY16的資料欄,或MOSTLY32套用至 32 位元資料類型的資料欄。

當資料欄中有相當多的值無法壓縮時,Mostly 編碼可能比無壓縮更沒效率。在將其中一種編碼套用到資料欄之前,請執行檢查。您現在將載入的大部分值 (也可能在未來載入) 應納入下表中顯示的範圍。

編碼 壓縮儲存空間大小 可以壓縮的值範圍 (範圍外的值會以原始形式儲存)
MOSTLY8 1 位元組 (8 位元) -128 到 127
MOSTLY16 2 位元組 (16 位元) -32768 到 32767
MOSTLY32 4 位元組 (32 位元) -2147483648 到 +2147483647
注意

對於小數,忽略小數點以判斷值是否納入範圍。例如,1,234.56 會被視為 123,456,並且可以在資料MOSTLY32欄中壓縮。

例如,VENUE資料表中的VENUEID資料欄定義為原始整數資料欄,這表示其值會耗用 4 個位元組的儲存空間。不過,此欄的值目前範圍是 0309。因此,使用 MOSTLY16編碼重新建立和重新載入此資料表VENUEID會將該資料欄中每個值的儲存體減少為 2 個位元組。

如果另一個資料表中參考VENUEID的值大多介於 0 到 127 的範圍內,則將該外鍵資料欄編碼為 可能合理MOSTLY8。在做出選擇之前,請針對參考資料表資料執行數個查詢,以了解值是否大部分都落入 8 位元、16 位元或 32 位元範圍。

下表顯示使用 MOSTLY8、 MOSTLY16和 MOSTLY32編碼時,特定數值的壓縮大小:

原始值 原始INT或BIGINT大小 (位元組) MOSTLY8 壓縮大小 (位元組) MOSTLY16 壓縮大小 (位元組) MOSTLY32 壓縮大小 (位元組)
1 4 1 2 4
10 4 1 2 4
100 4 1 2 4
1000 4 與原始資料大小相同 2 4
10000 4 2 4
20000 4 2 4
40000 8 與原始資料大小相同 4
100000 8 4
2000000000 8 4
Run length

執行長度編碼會將連續重複的值取代為由值和連續出現次數 (執行長度) 組成的符記。唯一值的個別字典是針對磁碟上資料欄值的每個區塊而建立的。(Amazon Redshift 磁碟會佔用 1 MB。) 此編碼最適合於資料值通常連續重複的資料表,例如,依那些值排序資料表時。

例如,假設大維度資料表中的資料欄具有可預測的小網域,例如可能值少於 10 的資料COLOR欄。這些值可能會落在整個資料表中的長序列中,即使資料未排序也是如此。

不建議在指定為排序索引鍵的任何資料欄上套用執行長度編碼。當區塊包含類似的列數時,限制範圍的掃描執行效果會更好。如果排序索引鍵欄位的壓縮比相同查詢中的其他欄位高出許多,限制範圍的掃描執行效果可能較差。

下表使用COLOR資料欄範例來顯示執行長度編碼的運作方式。

原始資料值 原始大小 (位元組) 壓縮值 (符記) 壓縮大小 (位元組)
Blue 4 {2,藍色} 5
Blue 4 0
Green 5 {3,綠色} 6
Green 5 0
Green 5 0
Blue 4 {1,Blue} 5
Yellow 6 {4,Yellow} 7
Yellow 6 0
Yellow 6 0
Yellow 6 0
合計 51 23
Text255 and Text32k

Text255 和 text32k 編碼有助於壓縮經常重複出現相同字詞的資料VARCHAR欄。唯一單字的個別字典是針對磁碟上資料欄值的每個區塊而建立的。(Amazon Redshift 磁碟會佔用 1 MB。) 字典包含資料欄中前 245 個唯一單字。那些單字會在磁碟上被代表 245 個值之一的一位元組索引值所取代,而且未在字典中表示的任何單字會以未壓縮形式儲存。對於每個 1 MB 磁碟區塊都會重複此程序。如果建立索引的單字經常出現在資料欄中,則資料欄將產生高壓縮率。

對於 text32k 編碼,原則相同,但每個區塊的字典不會擷取特定數目的單字。反之,字典會為其找到的每個唯一單字建立索引,直到結合的項目達到 32K 長度,減去一些額外負荷。索引值是以兩個位元組儲存。

例如,請考慮VENUE資料表中的資料VENUENAME欄。ArenaCenterTheatre 等單字反覆出現在這個欄中,而且若套用 text255 壓縮,則很可能出現在每個區塊中的前 245 個單字之中。如果是這樣,則此資料欄將受益於壓縮。因為每次那些單字出現,它們將只佔用 1 個位元組的儲存空間 (而不是分別佔用 5、6 或 7 個位元組)。

ZSTD

Zstandard (ZSTD) 編碼提供高壓縮率,在不同資料集之間具有非常良好的效能。ZSTD 特別適用於存放各種長短字串的 CHAR 和 VARCHAR資料欄,例如產品描述、使用者備註、日誌和JSON字串。其中 Delta 編碼或大部分編碼等某些演算法可能使用比沒有壓縮更多的儲存空間,ZSTD不太可能增加磁碟用量。

ZSTD 支援 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLEPRECISION、BOOLEAN、CHAR、VARCHAR、DATE、TIMESTAMP、 和 TIMESTAMPTZ 資料類型。

下表識別支援的壓縮編碼和支援編碼的資料類型。

編碼類型 CREATE TABLE 和 中的關鍵字 ALTER TABLE 資料類型
Raw (無壓縮) RAW 全部
AZ64 AZ64 SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP, TIMESTAMPTZ
Byte dictionary BYTEDICT SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ
Delta

DELTA

DELTA32K

SMALLINT, INT, BIGINT, DATE, TIMESTAMP, DECIMAL

INT, BIGINT, DATE, TIMESTAMP, DECIMAL

LZO LZO SMALLINT, INTEGER, BIGINT, DECIMAL, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ, SUPER
Mostlyn

MOSTLY8

MOSTLY16

MOSTLY32

SMALLINT, INT, BIGINT, DECIMAL

INT, BIGINT, DECIMAL

BIGINT, DECIMAL

Run-length RUNLENGTH SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ
文字

TEXT255

TEXT32K

VARCHAR 僅限

VARCHAR 僅限

Zstandard ZSTD SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ, SUPER