Pengkodean kompresi - Amazon Redshift

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pengkodean kompresi

Pengkodean kompresi menentukan jenis kompresi yang diterapkan ke kolom nilai data saat baris ditambahkan ke tabel.

ENCODEAUTOadalah default untuk tabel. Saat tabel disetel ke ENCODEAUTO, Amazon Redshift secara otomatis mengelola pengkodean kompresi untuk semua kolom dalam tabel. Untuk informasi selengkapnya, silakan lihat CREATE TABLE dan ALTER TABLE.

Namun, jika Anda menentukan pengkodean kompresi untuk kolom apa pun dalam tabel, tabel tidak lagi diatur ke ENCODEAUTO. Amazon Redshift tidak lagi secara otomatis mengelola pengkodean kompresi untuk semua kolom dalam tabel.

Saat Anda menggunakan CREATETABLE, ENCODE AUTO dinonaktifkan saat Anda menentukan pengkodean kompresi untuk kolom apa pun dalam tabel. Jika ENCODE AUTO dinonaktifkan, Amazon Redshift secara otomatis menetapkan pengkodean kompresi ke kolom yang tidak Anda tentukan jenisnya sebagai ENCODE berikut:

  • Kolom yang didefinisikan sebagai kunci pengurutan diberi RAW kompresi.

  • Kolom yang didefinisikan sebagai BOOLEANREAL,, atau tipe DOUBLE PRECISION data diberi RAW kompresi.

  • Kolom yang didefinisikan sebagai SMALLINTINTEGER,BIGINT,DECIMAL,,DATE,TIMESTAMP, atau tipe TIMESTAMPTZ data diberi AZ64 kompresi.

  • Kolom yang didefinisikan sebagai CHAR atau tipe VARCHAR data diberi LZO kompresi.

Anda dapat mengubah pengkodean tabel setelah membuatnya dengan menggunakan ALTERTABLE. Jika Anda menonaktifkan ENCODE AUTO penggunaan ALTERTABLE, Amazon Redshift tidak lagi secara otomatis mengelola pengkodean kompresi untuk kolom Anda. Semua kolom akan menyimpan jenis pengkodean kompresi yang mereka miliki saat Anda menonaktifkannya ENCODE AUTO hingga Anda mengubahnya atau Anda mengaktifkannya ENCODE AUTO lagi.

Amazon Redshift mendukung pengkodean kompresi berikut:

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.

catatan

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:

  • DELTAmencatat perbedaan sebagai nilai 1-byte (bilangan bulat 8-bit)

  • DELTA32Kmencatat perbedaan sebagai nilai 2-byte (bilangan bulat 16-bit)

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
catatan

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.

Tabel berikut mengidentifikasi pengkodean kompresi yang didukung dan tipe data yang mendukung pengkodean.

Jenis pengkodean Kata kunci dalam CREATE TABLE dan ALTER TABLE Jenis data
Mentah (tanpa kompresi) RAW Semua
AZ64 AZ64 SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP, TIMESTAMPTZ
Kamus byte BYTEDICT SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ
kuala

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
Sebagian besar n

MOSTLY8

MOSTLY16

MOSTLY32

SMALLINT, INT, BIGINT, DECIMAL

INT, BIGINT, DECIMAL

BIGINT, DECIMAL

Panjang lari RUNLENGTH SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ
Teks

TEXT255

TEXT32K

VARCHARhanya

VARCHARhanya

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