Dictionary レイアウト
Dictionary のレイアウトタイプ
Dictionary をメモリ上に保存する方法にはさまざまな種類があり、それぞれ CPU および RAM の使用量にトレードオフがあります。
| Layout | 説明 |
|---|---|
| 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 | 固定サイズのインメモリキャッシュです。頻繁にアクセスされるキーのみが保存されます。 |
| complex_key_cache | 複合キー向けの cache に似たレイアウトです。 |
| ssd_cache | cache に似ていますが、データを SSD 上に保存し、インメモリのインデックスを持ちます。 |
| complex_key_ssd_cache | 複合キー向けの ssd_cache に似たレイアウトです。 |
| direct | インメモリでの保存を行わず、各リクエストごとにソースを直接クエリします。 |
| complex_key_direct | 複合キー向けの direct に似たレイアウトです。 |
| ip_trie | 高速な IP プレフィックスルックアップ(CIDR ベース)のための Trie 構造です。 |
flat、hashed、および complex_key_hashed は、最も優れたクエリ性能を提供します。 キャッシュ系レイアウトは、性能が出にくく、パラメータ調整も困難なため推奨されません。詳細は cache を参照してください。
Dictionary レイアウトを指定する
ClickHouse Cloud でディクショナリを使用している場合は、ディクショナリの作成に DDL クエリオプションを使用し、ユーザー default でディクショナリを作成してください。
また、Cloud 互換性ガイド でサポートされているディクショナリソースの一覧を確認してください。
Dictionary レイアウトは、DDL では LAYOUT 句、設定ファイル定義では layout 設定で指定できます。
- DDL
- Configuration file
完全な DDL 構文については、CREATE DICTIONARY も参照してください。
レイアウトに complex-key* という語を含まない Dictionary は、キーとして UInt64 型を持ち、complex-key* を含む Dictionary は複合キー(任意の型を組み合わせた複雑なキー)を持ちます。
数値キーの例(カラム key_column は UInt64 型):
- DDL
- Configuration file
複合キーの例(キーは String 型の要素を 1 つ持つ):
- DDL
- Configuration file
Dictionary のパフォーマンスを改善する
Dictionary のパフォーマンスを改善する方法がいくつかあります。
- Dictionary を操作する関数は
GROUP BYの後に呼び出します。 - 抽出する属性を単射としてマークします。
属性は、異なるキーに対して異なる属性値が対応する場合に単射と呼ばれます。
そのため、
GROUP BYがキーから属性値を取得する関数を使用している場合、この関数は自動的にGROUP BYの外に分離されます。
ClickHouse は Dictionary に関連するエラーに対して例外をスローします。 エラーの例としては次のようなものがあります。
- アクセスしようとしている Dictionary をロードできなかった。
cachedDictionary へのクエリでエラーが発生した。
system.dictionaries テーブルで Dictionary の一覧とそのステータスを確認できます。