すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:辞書エンコーディング

最終更新日:Sep 27, 2024

AnalyticDB for PostgreSQLのBeamストレージエンジンは、辞書エンコーディング機能を提供します。 この機能により、低濃度の文字列データを整数データに圧縮して、ストレージ効率を向上させ、フィルターベースおよび集計ベースのクエリを高速化できます。

使用上の注意

  • エラスティックストレージモードのAnalyticDB for PostgreSQL V7.0.xインスタンスのみが、Beamストレージエンジンの辞書エンコーディング機能をサポートしています。

  • Beamストレージエンジンのディクショナリエンコーディング機能は、エラスティックストレージモードのAnalyticDB for PostgreSQL V7.0.6.2でパブリックプレビューが完了した後に正式に利用可能になります。 このバージョンでは、パブリックプレビュー中に発生する問題を修正します。 AnalyticDB for PostgreSQLインスタンスをV7.0.6.2以降に更新することを推奨します。

辞書エンコーディングを使用してストレージを圧縮

データ圧縮機能は、テーブルのストレージスペースを節約し、クエリのためにディスクから読み取る必要があるデータの量を減らすことができます。 これにより、I/O操作が減り、クエリのパフォーマンスが向上します。 さまざまな種類のデータに適した適切な圧縮アルゴリズムは、データベースのパフォーマンスを向上させるのに役立ちます。

AnalyticDB for PostgreSQLは、辞書エンコーディングを使用して文字列データのみを圧縮します。 列またはテーブルで辞書のエンコーディングを実行できます。

  • 列レベルの辞書エンコーディング: STRING型の特定の列を圧縮します。

  • テーブルレベルの辞書エンコーディング: 低カーディナリティの列を圧縮します。 文字列以外の列は、テーブルを作成するときに圧縮されません。

この例では、TPC-Hの表が使用されます。 Beamテーブルを作成するときは、compresstype='gdict' を使用して、テーブルの辞書エンコーディング圧縮を指定します。 このようにして、n_name列とn_comment列で辞書のエンコーディングが実行されます。 例:

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);

辞書のエンコーディングは、n_name列に対してのみ実行することもできます。 例:

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);

n_name列でディクショナリのエンコーディングを実行すると、データサイズは25バイトから2バイトに圧縮されます。 これにより、データストレージが大幅に削減されます。 元のCHARACTER(25) 型の場合、25文字より短い文字列の末尾にはスペースがパディングされます。

n_name

文字列値

元のデータサイズ (バイト)

辞書値

圧縮後のデータサイズ (バイト)

アルジェリア

25

0

2

アルゼンチン

25

1

2

ブラジル

25

2

2

カナダ

25

3

2

中国

25

4

2

エジプト

25

5

2

エチオピア

25

6

2

フランス

25

7

2

Total

200

/

16

辞書エンコーディングを使用したクエリの高速化

ディクショナリエンコーディングを使用してデータを圧縮した後、圧縮データに対してこの機能をさらに使用して、クエリを高速化できます。 低カーディナリティの文字列データを含むフィルタリング、集計、および並べ替えシナリオでは、辞書エンコーディングにより、さまざまなSQL文の200% を10% することでクエリのパフォーマンスを向上させることができます。

ディクショナリエンコードの高速化を有効にするには、adbpg_enable_encode_optimizeパラメーターをONに設定します。 デフォルトでは、このパラメータはOFFに設定されています。 辞書エンコードの高速化を有効にすると、オプティマイザは、辞書エンコード条件を満たすSQL文の適切な実行計画を自動的に生成します。 例:

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

EXPLAINステートメントを使用して、上記のステートメントの実行計画を照会できます。 実行プランには、使用されるエンコード方法とデコード用のデコード演算子が表示されます。

 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)

文字列データと比較して、辞書エンコーディングを使用して生成される整数データは、クエリのパフォーマンスを効果的に向上させます。 さらに、オプティマイザは、実行プラン内のDecode演算子を使用して、エンコードされたデータをデコードします。 これにより、クエリ実行の精度が保証されます。

自動圧縮エンコーディングの使用

ビーム記憶エンジンは、適応圧縮アルゴリズムをサポートする。 辞書のエンコーディングが適切かどうかわからない場合は、テーブルの作成時にcompressype='auto' を指定できます。 このようにして、ビーム記憶エンジンは、テーブルに対して適切な符号化圧縮アルゴリズムを自動的に選択する。

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);

次の表に、自動圧縮エンコードで設定されているテーブルの各列のエンコード方法を示します。

データ型

エンコード方法

説明

n_nationkey

Integer

LZ4または整数エンコーディング

この列は整数データを使用します。 デフォルトでは、LZ4または整数エンコーディングが使用されます。

n_name

キャラクター (25)

辞書エンコーディング

n_name列には、固定長の文字列データのセットで表される特定の国の名前が含まれます。 この列には辞書のエンコーディングが適しています。

n_regionkey

Integer

LZ4または整数エンコーディング

この列は整数データを使用します。 デフォルトでは、LZ4または整数エンコーディングが使用されます。

n_comment

キャラクターの変化 (152)

辞書エンコーディング

n_comment列には一意の文字列データが含まれます。 データ行の数がエンコードしきい値255より大きい場合、n_comment列には辞書エンコードの代わりにLZ4エンコードが使用されます。

辞書エンコーディングのデルタサポート

Beamストレージエンジンは、次の部分で構成されています。

  • リアルタイム書き込みを処理する行指向のDeltaストレージ。

  • バッチ書き込みと大規模スキャンを処理するPAXベースの列指向ベースストレージ。

重要

V7.0.2.3以降のAnalyticDB for PostgreSQLインスタンスは、ハイブリッド行と列ベースストレージをサポートします。

V7.0.4.0以降のAnalyticDB for PostgreSQLインスタンスは、辞書エンコーディングを簡単に使用できるように行指向のDeltaストレージをサポートしています。

たとえば、次のステートメントを実行し、EXPLAINステートメントを使用して実行計画を照会します。 実行プランは、デコード用のデコード演算子を示しています。 これにより、データ処理のパフォーマンスとデータセキュリティが向上し、辞書エンコーディングが容易になります。

 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