- Raw
-
Pengkodean mentah adalah pengkodean default untuk kolom yang ditetapkan sebagai kunci pengurutan dan kolom yang didefinisikan sebagaiBOOLEAN,REAL, atau tipe DOUBLE PRECISION data. Dengan pengkodean mentah, data disimpan dalam bentuk mentah dan tidak terkompresi.
- AZ64
-
AZ64adalah algoritma pengkodean kompresi eksklusif yang dirancang oleh Amazon untuk mencapai rasio kompresi tinggi dan pemrosesan kueri yang ditingkatkan. Pada intinya, AZ64 algoritma memampatkan kelompok nilai data yang lebih kecil dan menggunakan instruksi tunggal, beberapa data (SIMD) instruksi untuk pemrosesan paralel. Gunakan AZ64 untuk mencapai penghematan penyimpanan yang signifikan dan kinerja tinggi untuk tipe data numerik, tanggal, dan waktu.
Anda dapat menggunakan AZ64 sebagai pengkodean kompresi saat mendefinisikan kolom menggunakan CREATE TABLE dan ALTER TABLE pernyataan dengan tipe data berikut:
SMALLINT
INTEGER
BIGINT
DECIMAL
DATE
TIMESTAMP
TIMESTAMPTZ
- Byte-dictionary
-
Dalam pengkodean kamus byte, kamus terpisah dari nilai unik dibuat untuk setiap blok nilai kolom pada disk. (Blok disk Amazon Redshift menempati 1 MB.) Kamus berisi hingga 256 nilai satu-byte yang disimpan sebagai indeks ke nilai data asli. Jika lebih dari 256 nilai disimpan dalam satu blok, nilai tambahan ditulis ke dalam blok dalam bentuk mentah dan tidak terkompresi. Proses ini berulang untuk setiap blok disk.
Pengkodean ini sangat efektif pada kolom string kardinalitas rendah. Pengkodean ini optimal ketika domain data kolom kurang dari 256 nilai unik.
Untuk kolom dengan tipe data string (CHARdanVARCHAR) yang dikodekanBYTEDICT, Amazon Redshift melakukan pemindaian vektor dan evaluasi predikat yang beroperasi melalui data terkompresi secara langsung. Pemindaian ini menggunakan instruksi tunggal khusus perangkat keras dan beberapa data () SIMD instruksi untuk pemrosesan paralel. Ini secara signifikan mempercepat pemindaian kolom string. Pengkodean byte-dictionary sangat hemat ruang jika kolomCHAR/VARCHARmemegang string karakter yang panjang.
Misalkan sebuah tabel memiliki COUNTRY kolom dengan tipe data CHAR (30). Saat data dimuat, Amazon Redshift membuat kamus dan mengisi COUNTRY kolom dengan nilai indeks. Kamus berisi nilai unik yang diindeks, dan tabel itu sendiri hanya berisi subskrip satu byte dari nilai yang sesuai.
Trailing blank disimpan untuk kolom karakter dengan panjang tetap. Oleh karena itu, dalam kolom CHAR (30), setiap nilai terkompresi menyimpan 29 byte penyimpanan saat Anda menggunakan pengkodean byte-dictionary.
Tabel berikut mewakili kamus untuk COUNTRY kolom.
Nilai data unik |
Indeks kamus |
Ukuran (panjang tetap, 30 byte per nilai) |
England |
0 |
30 |
United States of America |
1 |
30 |
Venezuela |
2 |
30 |
Sri Lanka |
3 |
30 |
Argentina |
4 |
30 |
Japan |
5 |
30 |
Total |
|
180 |
Tabel berikut mewakili nilai-nilai dalam COUNTRY kolom.
Nilai data asli |
Ukuran asli (panjang tetap, 30 byte per nilai) |
Nilai terkompresi (indeks) |
Ukuran baru (byte) |
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 |
Total |
300 |
|
10 |
Total ukuran terkompresi dalam contoh ini dihitung sebagai berikut: 6 entri berbeda disimpan dalam kamus (6 * 30 = 180), dan tabel berisi 10 nilai terkompresi 1-byte, dengan total 190 byte.
- Delta
-
Pengkodean Delta sangat berguna untuk kolom waktu tanggal.
Delta encoding memampatkan data dengan merekam perbedaan antara nilai-nilai yang mengikuti satu sama lain di kolom. Perbedaan ini dicatat dalam kamus terpisah untuk setiap blok nilai kolom pada disk. (Blok disk Amazon Redshift menempati 1 MB.) Misalnya, anggaplah kolom berisi 10 bilangan bulat secara berurutan dari 1 hingga 10. Yang pertama disimpan sebagai integer 4-byte (ditambah bendera 1-byte). Sembilan berikutnya masing-masing disimpan sebagai byte dengan nilai 1, menunjukkan bahwa itu adalah satu lebih besar dari nilai sebelumnya.
Delta encoding hadir dalam dua variasi:
Jika sebagian besar nilai dalam kolom dapat dikompresi dengan menggunakan satu byte, variasi 1-byte sangat efektif. Namun, jika delta lebih besar, pengkodean ini, dalam kasus terburuk, agak kurang efektif daripada menyimpan data yang tidak terkompresi. Logika serupa berlaku untuk versi 16-bit.
Jika perbedaan antara dua nilai melebihi rentang 1-byte (DELTA) atau rentang 2-byte (DELTA32K), nilai asli penuh disimpan, dengan tanda 1-byte terkemuka. Rentang 1-byte adalah dari -127 hingga 127, dan kisaran 2-byte adalah dari -32K hingga 32K.
Tabel berikut menunjukkan bagaimana pengkodean delta bekerja untuk kolom numerik.
Nilai data asli |
Ukuran asli (byte) |
Perbedaan (delta) |
Nilai terkompresi |
Ukuran terkompresi (byte) |
1 |
4 |
|
1 |
1+4 (tanda+nilai aktual) |
5 |
4 |
4 |
4 |
1 |
50 |
4 |
45 |
45 |
1 |
200 |
4 |
150 |
150 |
1+4 (tanda+nilai aktual) |
185 |
4 |
-15 |
-15 |
1 |
220 |
4 |
35 |
35 |
1 |
221 |
4 |
1 |
1 |
1 |
Total |
28 |
|
|
15 |
- LZO
-
LZOpengkodean memberikan rasio kompresi yang sangat tinggi dengan kinerja yang baik. LZOpengkodean bekerja sangat baik untuk CHAR dan VARCHAR kolom yang menyimpan string karakter yang sangat panjang. Mereka sangat baik untuk teks bentuk bebas, seperti deskripsi produk, komentar pengguna, atau string. JSON
- Mostly
-
Sebagian besar pengkodean berguna ketika tipe data untuk kolom lebih besar dari yang dibutuhkan sebagian besar nilai yang disimpan. Dengan menentukan sebagian besar pengkodean untuk jenis kolom ini, Anda dapat mengompres sebagian besar nilai di kolom ke ukuran penyimpanan standar yang lebih kecil. Nilai yang tersisa yang tidak dapat dikompresi disimpan dalam bentuk mentahnya. Misalnya, Anda dapat mengompres kolom 16-bit, seperti INT2 kolom, ke penyimpanan 8-bit.
Secara umum, sebagian besar pengkodean bekerja dengan tipe data berikut:
-
SMALLINT/INT2(16-bit)
-
INTEGER/INT(32-bit)
-
BIGINT/INT8(64-bit)
-
DECIMAL/NUMERIC(64-bit)
Pilih variasi yang sesuai dari sebagian besar pengkodean agar sesuai dengan ukuran tipe data untuk kolom. Misalnya, berlaku MOSTLY8 untuk kolom yang didefinisikan sebagai kolom integer 16-bit. Menerapkan MOSTLY16 ke kolom dengan tipe data 16-bit atau MOSTLY32 ke kolom dengan tipe data 32-bit tidak diperbolehkan.
Sebagian besar pengkodean mungkin kurang efektif daripada tidak ada kompresi ketika jumlah nilai yang relatif tinggi dalam kolom tidak dapat dikompresi. Sebelum menerapkan salah satu pengkodean ini ke kolom, lakukan pemeriksaan. Sebagian besar nilai yang akan Anda muat sekarang (dan kemungkinan akan dimuat di masa depan) harus sesuai dengan rentang yang ditunjukkan pada tabel berikut.
Encoding |
Ukuran penyimpanan terkompresi |
Rentang nilai yang dapat dikompresi (nilai di luar rentang disimpan mentah) |
MOSTLY8 |
1 byte (8 bit) |
-128 hingga 127 |
MOSTLY16 |
2 byte (16 bit) |
-32768 ke 32767 |
MOSTLY32 |
4 byte (32 bit) |
-2147483648 ke +2147483647 |
Untuk nilai desimal, abaikan titik desimal untuk menentukan apakah nilainya cocok dengan rentang. Misalnya, 1.234,56 diperlakukan sebagai 123.456 dan dapat dikompresi dalam kolom. MOSTLY32
Misalnya, VENUEID kolom dalam VENUE tabel didefinisikan sebagai kolom integer mentah, yang berarti nilainya mengkonsumsi 4 byte penyimpanan. Namun, rentang nilai saat ini di kolom adalah 0
untuk309
. Oleh karena itu, membuat ulang dan memuat ulang tabel ini dengan MOSTLY16 pengkodean untuk VENUEID akan mengurangi penyimpanan setiap nilai di kolom itu menjadi 2 byte.
Jika VENUEID nilai yang direferensikan dalam tabel lain sebagian besar berada dalam kisaran 0 hingga 127, mungkin masuk akal untuk menyandikan kolom kunci asing itu sebagai. MOSTLY8 Sebelum membuat pilihan, jalankan beberapa kueri terhadap data tabel referensi untuk mengetahui apakah nilai sebagian besar jatuh ke dalam kisaran 8-bit, 16-bit, atau 32-bit.
Tabel berikut menunjukkan ukuran terkompresi untuk nilai numerik tertentu ketikaMOSTLY8,MOSTLY16, dan MOSTLY32 pengkodean digunakan:
Nilai asli |
Asli INT atau BIGINT ukuran (byte) |
MOSTLY8ukuran terkompresi (byte) |
MOSTLY16ukuran terkompresi (byte) |
MOSTLY32ukuran terkompresi (byte) |
1 |
4 |
1 |
2 |
4 |
10 |
4 |
1 |
2 |
4 |
100 |
4 |
1 |
2 |
4 |
1000 |
4 |
Sama seperti ukuran data mentah |
2 |
4 |
10000 |
4 |
2 |
4 |
20000 |
4 |
2 |
4 |
40000 |
8 |
Sama seperti ukuran data mentah |
4 |
100000 |
8 |
4 |
2000000000 |
8 |
4 |
- Run length
-
Run length encoding menggantikan nilai yang diulang secara berurutan dengan token yang terdiri dari nilai dan hitungan jumlah kejadian berurutan (panjang run). Kamus terpisah dari nilai unik dibuat untuk setiap blok nilai kolom pada disk. (Blok disk Amazon Redshift menempati 1 MB.) Pengkodean ini paling cocok untuk tabel di mana nilai data sering diulang secara berurutan, misalnya, ketika tabel diurutkan berdasarkan nilai-nilai tersebut.
Misalnya, anggaplah bahwa kolom dalam tabel dimensi besar memiliki domain kecil yang dapat diprediksi, seperti COLOR kolom dengan nilai kurang dari 10 kemungkinan. Nilai-nilai ini cenderung jatuh dalam urutan panjang di seluruh tabel, bahkan jika data tidak diurutkan.
Kami tidak menyarankan menerapkan pengkodean panjang run pada kolom apa pun yang ditetapkan sebagai kunci pengurutan. Pemindaian terbatas rentang berkinerja lebih baik ketika blok berisi jumlah baris yang sama. Jika kolom kunci sortir dikompresi jauh lebih tinggi daripada kolom lain dalam kueri yang sama, pemindaian terbatas rentang mungkin berkinerja buruk.
Tabel berikut menggunakan contoh COLOR kolom untuk menunjukkan cara kerja pengkodean run length.
Nilai data asli |
Ukuran asli (byte) |
Nilai terkompresi (token) |
Ukuran terkompresi (byte) |
Blue |
4 |
{2, Biru} |
5 |
Blue |
4 |
0 |
Green |
5 |
{3, Hijau} |
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 |
Total |
51 |
|
23 |
- Text255 and Text32k
-
Pengkodean Text255 dan text32k berguna untuk mengompresi VARCHAR kolom di mana kata-kata yang sama sering berulang. Kamus terpisah dari kata-kata unik dibuat untuk setiap blok nilai kolom pada disk. (Blok disk Amazon Redshift menempati 1 MB.) Kamus berisi 245 kata unik pertama di kolom. Kata-kata itu diganti pada disk dengan nilai indeks satu byte yang mewakili salah satu dari 245 nilai, dan kata-kata apa pun yang tidak diwakili dalam kamus disimpan tanpa kompresi. Proses ini berulang untuk setiap blok disk 1-MB. Jika kata-kata yang diindeks sering muncul di kolom, kolom menghasilkan rasio kompresi yang tinggi.
Untuk pengkodean text32k, prinsipnya sama, tetapi kamus untuk setiap blok tidak menangkap sejumlah kata tertentu. Sebaliknya, kamus mengindeks setiap kata unik yang ditemukannya hingga entri gabungan mencapai panjang 32K, dikurangi beberapa overhead. Nilai indeks disimpan dalam dua byte.
Misalnya, perhatikan VENUENAME kolom dalam VENUE tabel. Kata-kata sepertiArena
,Center
, dan Theatre
berulang di kolom ini dan cenderung berada di antara 245 kata pertama yang ditemui di setiap blok jika kompresi text255 diterapkan. Jika demikian, kolom ini mendapat manfaat dari kompresi. Ini karena setiap kali kata-kata itu muncul, mereka hanya menempati 1 byte penyimpanan (bukan 5, 6, atau 7 byte, masing-masing).
- ZSTD
-
Pengkodean Zstandard (ZSTD) memberikan rasio kompresi tinggi dengan kinerja yang sangat baik di berbagai kumpulan data. ZSTDbekerja sangat baik dengan CHAR dan VARCHAR kolom yang menyimpan berbagai string panjang dan pendek, seperti deskripsi produk, komentar pengguna, log, dan JSON string. Di mana beberapa algoritma, seperti pengkodean Delta atau sebagian besar pengkodean, berpotensi menggunakan lebih banyak ruang penyimpanan daripada tidak ada kompresi, tidak mungkin ZSTD meningkatkan penggunaan disk.
ZSTDmendukungSMALLINT,INTEGER,BIGINT,DECIMAL,REAL, DOUBLEPRECISION,BOOLEAN,CHAR,VARCHAR,DATE,TIMESTAMP, dan tipe TIMESTAMPTZ data.