All Products
Search
Document Center

AnalyticDB:Pengkodean kamus

Last Updated:Jun 26, 2025

Mesin penyimpanan Beam dari AnalyticDB for PostgreSQL menyediakan fitur pengkodean kamus. Fitur ini mengompres data string dengan kardinalitas rendah menjadi data integer untuk meningkatkan efisiensi penyimpanan dan mempercepat kueri berbasis filter serta agregat.

Catatan penggunaan

  • Hanya instance AnalyticDB for PostgreSQL V7.0.x dalam mode penyimpanan elastis yang mendukung fitur pengkodean kamus dari mesin penyimpanan Beam.

  • Fitur pengkodean kamus dari mesin penyimpanan Beam tersedia secara resmi setelah pratinjau publik selesai pada AnalyticDB for PostgreSQL V7.0.6.2 dalam mode penyimpanan elastis. Versi ini memperbaiki masalah yang terjadi selama pratinjau publik. Kami menyarankan Anda untuk memperbarui instance AnalyticDB for PostgreSQL ke versi V7.0.6.2 atau yang lebih baru.

Gunakan pengkodean kamus untuk mengompres penyimpanan

Fitur kompresi data dapat menghemat ruang penyimpanan tabel dan mengurangi jumlah data yang perlu dibaca dari disk untuk kueri. Hal ini mengurangi operasi I/O serta meningkatkan kinerja kueri. Algoritma kompresi yang sesuai untuk berbagai jenis data dapat membantu meningkatkan kinerja database.

AnalyticDB for PostgreSQL menggunakan pengkodean kamus hanya untuk mengompres data string. Anda dapat menerapkan pengkodean kamus pada kolom atau tabel.

  • Pengkodean kamus tingkat kolom: mengompres kolom tertentu bertipe STRING.

  • Pengkodean kamus tingkat tabel: mengompres kolom dengan kardinalitas rendah. Kolom non-string tidak dikompres saat pembuatan tabel.

Dalam contoh ini, tabel nation dari TPC-H digunakan. Saat membuat tabel Beam, gunakan compresstype='gdict' untuk menentukan kompresi pengkodean kamus untuk tabel tersebut. Dengan cara ini, pengkodean kamus diterapkan pada kolom n_name dan n_comment. Contoh pernyataan:

CREATE TABLE NATION (
    n_nationkey integer NOT NULL,
    n_name character(25) NOT NULL,
    n_regionkey integer NOT NULL,
    n_comment character varying(152)
)
USING beam WITH (compresstype = 'gdict') 
DISTRIBUTED by (n_nationkey);

Anda juga dapat menerapkan pengkodean kamus hanya pada kolom n_name. Contoh pernyataan:

CREATE TABLE NATION (
    n_nationkey integer NOT NULL,
    n_name character(25) NOT NULL ENCODING (compresstype='gdict'),
    n_regionkey integer NOT NULL,
    n_comment character varying(152)
)
USING beam WITH (compresstype = 'lz4', compresslevel = 9) 
DISTRIBUTE by (n_nationkey);

Setelah menerapkan pengkodean kamus pada kolom n_name, ukuran data dikompres dari 25 byte menjadi 2 byte. Ini sangat mengurangi kebutuhan penyimpanan data. Untuk tipe CHARACTER(25) asli, akhir dari string yang lebih pendek dari 25 karakter diisi dengan spasi.

n_name

Nilai string

Ukuran data asli (byte)

Nilai kamus

Ukuran data setelah kompresi (byte)

ALGERIA

25

0

2

ARGENTINA

25

1

2

BRAZIL

25

2

2

CANADA

25

3

2

CHINA

25

4

2

EGYPT

25

5

2

ETHIOPIA

25

6

2

FRANCE

25

7

2

Total

200

/

16

Gunakan pengkodean kamus untuk mempercepat kueri

Setelah data dikompres menggunakan pengkodean kamus, Anda dapat memanfaatkan fitur ini lebih lanjut pada data terkompresi untuk mempercepat kueri. Dalam skenario penyaringan, penggabungan, dan pengurutan yang melibatkan data string dengan kardinalitas rendah, pengkodean kamus dapat meningkatkan kinerja kueri sebesar 10% hingga 200% untuk berbagai pernyataan SQL.

Untuk mengaktifkan percepatan pengkodean kamus, atur parameter adbpg_enable_encode_optimize ke ON. Secara default, parameter ini disetel ke OFF. Setelah mengaktifkan percepatan pengkodean kamus, pengoptimal secara otomatis menghasilkan rencana eksekusi yang sesuai untuk pernyataan SQL yang memenuhi kondisi pengkodean kamus. Contoh pernyataan:

SELECT
	n_name,
	max(n_regionkey)
FROM
	nation
WHERE
	n_name > 'ALGERIA'
	AND n_name < 'FRANCE'
GROUP BY
	n_name;

Anda dapat menggunakan pernyataan EXPLAIN untuk menanyakan rencana eksekusi dari pernyataan sebelumnya. Rencana eksekusi menunjukkan metode pengkodean yang digunakan dan operator Decode untuk dekode.

 QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Gather Motion 3:1  (slice1; segments: 3)  (cost=76.72..78.27 rows=81 width=36)
   ->  GroupAggregate  (cost=76.72..77.19 rows=27 width=36)
         Group Key: n_name
         ->  Sort  (cost=76.72..76.79 rows=28 width=36)
               Sort Key: n_name
               ->  Redistribute Motion 3:3  (slice2; segments: 3)  (cost=0.00..76.05 rows=28 width=36)
                     Hash Key: n_name
                     ->  Decode  (cost=0.00..75.50 rows=28 width=36)
                           Params: dictKeyIdx[1], dictID[0]
                           ->  Seq Scan on nation  (cost=0.00..75.50 rows=28 width=36)
                                 Filter: ((ordered_encode(n_name) > ('ALGERIA'::text)::integer with dict ID 0) AND (ordered_encode(n_name) < ('FRANCE'::text)::integer with dict ID 0))
 Optimizer: Postgres query optimizer
(12 rows)

Dibandingkan dengan data string, data integer yang dihasilkan menggunakan pengkodean kamus dapat secara efektif meningkatkan kinerja kueri. Selain itu, pengoptimal menggunakan operator Decode dalam rencana eksekusi untuk mendekode data yang telah dikodekan. Ini memastikan akurasi pelaksanaan kueri.

Gunakan pengkodean kompresi otomatis

Mesin penyimpanan Beam mendukung algoritma kompresi adaptif. Jika Anda tidak yakin apakah pengkodean kamus cocok, Anda dapat menentukan compresstype = 'auto' saat membuat tabel. Dengan cara ini, mesin penyimpanan Beam secara otomatis memilih algoritma kompresi pengkodean yang sesuai untuk tabel tersebut.

CREATE TABLE NATION (
    n_nationkey integer NOT NULL,
    n_name character(25) NOT NULL,
    n_regionkey integer NOT NULL,
    n_comment character varying(152)
)
USING beam WITH (compresstype = 'auto') 
DISTRIBUTE by (n_nationkey);

Tabel berikut menjelaskan metode pengkodean untuk setiap kolom tabel nation yang dikonfigurasi dengan pengkodean kompresi otomatis.

Kolom

Tipe data

Metode pengkodean

Deskripsi

n_nationkey

Integer

LZ4 atau pengkodean integer

Kolom ini menggunakan data integer. Secara default, LZ4 atau pengkodean integer digunakan.

n_name

Character(25)

Pengkodean kamus

Kolom n_name berisi nama negara tertentu yang direpresentasikan oleh serangkaian data string dengan panjang tetap. Pengkodean kamus cocok untuk kolom ini.

n_regionkey

Integer

LZ4 atau pengkodean integer

Kolom ini menggunakan data integer. Secara default, LZ4 atau pengkodean integer digunakan.

n_comment

Character varying(152)

Pengkodean kamus

Kolom n_comment berisi data string unik. Jika jumlah baris data lebih besar dari ambang pengkodean 255, pengkodean LZ4 digunakan sebagai ganti pengkodean kamus untuk kolom n_comment.

Dukungan Delta untuk pengkodean kamus

Mesin penyimpanan Beam terdiri dari bagian-bagian berikut:

  • Penyimpanan Delta berorientasi baris yang menangani penulisan waktu nyata.

  • Penyimpanan Base berorientasi kolom berbasis PAX yang menangani penulisan batch dan pemindaian berskala besar.

Penting

Instance AnalyticDB for PostgreSQL versi V7.0.2.3 atau lebih baru mendukung penyimpanan Base hibrida berorientasi baris-kolom.

Instance AnalyticDB for PostgreSQL versi V7.0.4.0 atau lebih baru mendukung penyimpanan Delta berorientasi baris untuk penggunaan pengkodean kamus yang lebih mudah.

Sebagai contoh, jalankan pernyataan berikut dan gunakan pernyataan EXPLAIN untuk menanyakan rencana eksekusi. Rencana eksekusi menunjukkan operator Decode untuk dekode. Ini meningkatkan kinerja pemrosesan data dan keamanan data untuk penggunaan pengkodean kamus yang lebih mudah.

 CREATE TABLE test_auto(a int, b text) 
 using beam with(compresstype=auto,compresslevel=5);

 INSERT INTO test_auto values (1,'adbpg1'),(2,'adbpg2'), (3, 'adbpg3'),(10,'adbpg10');

SET adbpg_enable_encode_optimize to ON;

 explain SELECT * FROM test_auto WHERE b='adbpg1';
 -----------------------------------------------------------------------------
 Gather Motion 3:1  (slice1; segments: 3)  (cost=0.00..2.04 rows=1 width=36)
   ->  Decode  (cost=0.00..2.02 rows=1 width=36)
         Params: dictKeyIdx[2], dictID[0]
         ->  Seq Scan on test_auto  (cost=0.00..2.02 rows=1 width=36)
               Filter: (encode(b) = ('adbpg1'::text)::integer with dict ID 0)
 Optimizer: Postgres-based planner