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_regionkey | Integer | LZ4または整数エンコーディング | この列は整数データを使用します。 デフォルトでは、LZ4または整数エンコーディングが使用されます。 |
n_comment | キャラクターの変化 (152) | 辞書エンコーディング |
|
辞書エンコーディングのデルタサポート
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