テーブル内のフィールドのカーディナリティが比較的小さい場合は、辞書エンコードを使用してデータ圧縮率を向上させることができます。 これにより、データ ストレージ サイズを削減し、クエリ パフォーマンスを向上させることができます。 Hologres は、指定されたフィールドの辞書エンコードをサポートしています。 このトピックでは、Hologres で辞書エンコードを設定するために使用されるステートメントと関連する原則について説明します。
概要
辞書エンコードは、文字列比較を数値比較に変換して、GROUP BY句とFILTER句を含むクエリなど、クエリを高速化できます。 さらに、データ圧縮率が向上し、ストレージ容量が減少します。 Hologres では、特定の列に対して辞書エンコードを有効にすることができます。 このようにして、特定の列の値に対して辞書マッピングが構築されます。 辞書エンコード機能を設定するには、次の構文を使用します。
-- Hologres V2.1 以降でサポートされている構文
CREATE TABLE <table_name> (...) WITH (dictionary_encoding_columns = '[<columnName>{:[on|off|auto]}[,...]]');
-- すべての Hologres バージョンでサポートされている構文
CREATE TABLE <table_name> (...);
CALL set_table_property('table_name', 'dictionary_encoding_columns', '[<columnName>{:[on|off|auto]}[,...]]');次の表は、上記の構文のパラメーターを示しています。
パラメーター | 説明 |
table_name | テーブルの名前。 |
on | 現在の列に対して辞書エンコードを有効にします。 |
off | 現在の列に対して辞書エンコードを無効にします。 |
auto | Hologres が辞書エンコードを有効にするかどうかを自動的に決定するように指定します。 列に
|
推奨事項
文字列比較を行い、値の再帰率が高い列に対して辞書マッピングを作成することをお勧めします。
すべての列に対して辞書マッピングを作成することはお勧めしません。 そうしないと、余分なエンコードおよびデコードのオーバーヘッドが発生します。
JSON 形式のデータが TEXT データ型として保存されている列に対して辞書マッピングを作成することはお勧めしません。
テーブルの作成後に dictionary_encoding_columns プロパティを変更することで、指定された列の辞書マッピングを作成できます。 変更された列はすぐに有効になりません。 辞書マッピングはバックエンドで非同期的に構築または削除されます。 詳細については、「ALTER TABLE」をご参照ください。
辞書エンコードを無効にすることはお勧めしません。 辞書エンコードを無効にすると、データ圧縮率が低くなり、ストレージ容量が増加します。
dictionary_encoding_columnsをautoに設定することをお勧めします。
使用上の注意
辞書エンコードは、列指向または行と列のハイブリッド ストレージ モデルを使用するテーブルに対してのみ有効にすることができます。
dictionary_encoding_columns プロパティで指定された列は null 許容です。
値が少ない列に対してのみ辞書マッピングを作成することをお勧めします。 これにより、必要なストレージを削減できます。
Hologres V0.8 以前では、デフォルトで TEXT データ型のすべての列に対して辞書エンコードが有効になっています。 Hologres V0.9 以降では、デフォルトで TEXT データ型のすべての列に対して
dictionary_encoding_columnsプロパティがautoに設定されています。 テーブルの列にデータが書き込まれるとき、列内の値の再帰率が90%以上の場合、Hologres はその列に対して辞書エンコードを有効にします。
仕組
辞書エンコードは、Hologres が未加工データを NUMERIC 型のデータとしてエンコードおよび保存し、対応するエンコード スキーマを維持できるようにするデータ圧縮技術です。 データ読み取り中に、Hologres はエンコード スキーマに基づいてデータをデコードします。 したがって、辞書エンコードは、文字列比較を含む列、特に値の再帰率が高い列に対する GROUP BY 句と FILTER 句を含むクエリなど、クエリを高速化できます。 デフォルトでは、Hologres は TEXT データ型のすべての列に対して辞書エンコードを有効にします。 ただし、デコード プロセスでは、余分な計算オーバーヘッドが発生します。 値の再帰率が低い列 (列の値の半分が異なる) と結合操作で使用される列の場合、辞書エンコードでは、より多くの余分なエンコードおよびデコード オーバーヘッドが発生します。 したがって、すべての列に対して辞書マッピングを作成することはお勧めしません。 次の図は、辞書エンコードの技術的原則を示しています。
例
Hologres V2.1 以降でサポートされている構文:
CREATE TABLE tbl ( a int NOT NULL, b text NOT NULL, c text NOT NULL ) WITH ( dictionary_encoding_columns = 'a:on,b:off,c:auto' ); -- 辞書マッピングを変更します。 ALTER TABLE tbl SET (dictionary_encoding_columns = 'a:off'); --ALTER TABLE ステートメントを使用して、すべての列の辞書マッピングのみを変更できます。すべての Hologres バージョンでサポートされている構文:
-- tbl という名前のテーブルを作成し、辞書マッピングを構築します。 begin; create table tbl ( a int not null, b text not null, c text not null ); call set_table_property('tbl', 'dictionary_encoding_columns', 'a:on,b:off,c:auto'); commit; -- 辞書マッピングを変更します。 call set_table_property('tbl', 'dictionary_encoding_columns', 'a:off');-- すべての列の dictionary_encoding_columns プロパティを変更します。 列 b と列 c は TEXT データ型の列であり、デフォルトで辞書マッピングが構築されます。 call update_table_property('tbl', 'dictionary_encoding_columns', 'c:off');-- 列 c の dictionary_encoding_columns プロパティのみを変更します。 列 c の辞書エンコードを無効にします。
参照
ビジネス クエリ シナリオに基づいてテーブル プロパティを設定する方法の詳細については、「シナリオ固有のテーブル作成とチューニングに関するガイド」をご参照ください。
Hologres 内部テーブルの DDL ステートメントの詳細については、以下のトピックをご参照ください。