Dictionary レイアウトの種類
Dictionary をメモリ内に格納する方法は複数あり、それぞれ CPU 使用量と RAM 使用量の間でトレードオフがあります。
| レイアウト | 説明 |
|---|---|
| flat | キーで索引付けされたフラットな配列にデータを格納します。最も高速なレイアウトですが、キーは UInt64 で、max_array_size 以内である必要があります。 |
| hashed | ハッシュテーブルにデータを格納します。キーサイズに制限はなく、任意の数の要素をサポートします。 |
| sparse_hashed | hashed と似ていますが、CPU 使用量と引き換えにメモリ使用量を抑えます。 |
| complex_key_hashed | hashed と同様ですが、複合キーに対応します。 |
| complex_key_sparse_hashed | sparse_hashed と同様ですが、複合キーに対応します。 |
| hashed_array | キーを配列インデックスに対応付けるハッシュテーブルを使い、属性を配列に格納します。属性数が多い場合にメモリ効率に優れます。 |
| complex_key_hashed_array | hashed_array と同様ですが、複合キーに対応します。 |
| range_hashed | 順序付けされた範囲を持つハッシュテーブルです。キー + 日付/時刻の範囲によるルックアップをサポートします。 |
| complex_key_range_hashed | range_hashed と同様ですが、複合キーに対応します。 |
| cache | 固定サイズのインメモリ cache です。頻繁にアクセスされるキーだけを格納します。 |
| complex_key_cache | cache と同様ですが、複合キーに対応します。 |
| ssd_cache | cache と同様ですが、データは SSD に格納され、索引はメモリ内に保持されます。 |
| complex_key_ssd_cache | ssd_cache と同様ですが、複合キーに対応します。 |
| direct | メモリ内には格納せず、リクエストごとにソースへ直接クエリします。 |
| complex_key_direct | direct と同様ですが、複合キーに対応します。 |
| ip_trie | IP プレフィックスを高速にルックアップするための Trie 構造です (CIDR ベース) 。 |
| hierarchical | 親子関係を表す数値キーを使用した階層構造をサポートします。 |
| polygon | 効率的な point-in-polygon ルックアップ (逆ジオコーディング) を提供します。 |
| regexp_tree | キーを正規表現のツリー構造に照合します。 |
Dictionary のレイアウトを指定する
Dictionary のレイアウトは、LAYOUT 句 (DDL の場合) または設定ファイル定義の layout 設定で指定できます。
CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- レイアウト設定
...<clickhouse>
<dictionary>
...
<layout>
<layout_type>
<!-- レイアウト設定 -->
</layout_type>
</layout>
...
</dictionary>
</clickhouse>完全な DDL 構文については、CREATE DICTIONARY も参照してください。
レイアウト名に complex-key* を含まない Dictionary は UInt64 型のキーを持ち、complex-key* Dictionary は複合キー (複雑で、任意の型を持つキー) を持ちます。
数値キーの例 (カラム key_column は UInt64 型) :
CREATE DICTIONARY dict_name (
key_column UInt64,
...
)
PRIMARY KEY key_column<structure>
<id>
<name>key_column</name>
</id>
...
</structure>複合キーの例 (キーは String 型の要素を 1 つ持ちます) :
CREATE DICTIONARY dict_name (
country_code String,
...
)
PRIMARY KEY country_code<structure>
<key>
<attribute>
<name>country_code</name>
<type>String</type>
</attribute>
</key>
...
</structure>Dictionary のパフォーマンスを向上させる
Dictionary のパフォーマンスを向上させる方法はいくつかあります。
GROUP BYの後で、Dictionary を使用する関数を呼び出します。- 取得する属性を injective としてマークします。
異なるキーに異なる属性値が対応する場合、その属性は injective と呼ばれます。
そのため、
GROUP BYでキーから属性値を取得する関数を使用している場合、この関数は自動的にGROUP BYから除外されます。
ClickHouse は Dictionary に関するエラーに対して例外を生成します。 エラーの例としては、次のようなものがあります。
- アクセスしている Dictionary を読み込めない。
cachedDictionary のクエリ時のエラー。
Dictionary の一覧とそのステータスは、system.dictionaries テーブルで確認できます。