跳转到主内容
跳转到主内容

字典布局

字典布局类型

将字典存储在内存中有多种方式,每种方式在 CPU 和内存使用上都有取舍。

布局描述
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 结构。
推荐布局

flathashedcomplex_key_hashed 提供最佳查询性能。 不推荐使用缓存型布局,因为其可能具有较差的性能且参数调优困难——详情参见 cache

指定字典布局

提示

如果你在 ClickHouse Cloud 中使用字典,请使用 DDL 查询方式来创建字典,并使用用户 default 创建字典。 另外,请在 Cloud Compatibility 指南 中核对受支持的字典数据源列表。

可以使用 LAYOUT 子句(用于 DDL)或在配置文件定义中通过 layout 设置来配置字典布局。

CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- layout settings
...

另请参阅 CREATE DICTIONARY 以获取完整的 DDL 语法。

布局名称中不包含单词 complex-key* 的字典,其键的类型为 UInt64complex-key* 字典则具有复合键(复杂键,支持任意类型的组合)。

数值键示例(列 key_column 的类型为 UInt64):

CREATE DICTIONARY dict_name (
    key_column UInt64,
    ...
)
PRIMARY KEY key_column

复合键示例(key 仅包含一个元素,类型为 String):

CREATE DICTIONARY dict_name (
    country_code String,
    ...
)
PRIMARY KEY country_code

提升字典性能

有多种方式可以提升字典性能:

  • GROUP BY 之后再调用用于处理字典的函数。
  • 将要提取的属性标记为单射属性。 如果不同的键对应不同的属性值,则该属性称为单射。 因此,当 GROUP BY 使用按键获取属性值的函数时,此函数会自动从 GROUP BY 子句中被提取出来单独执行。

ClickHouse 在发生与字典相关的错误时会抛出异常。 错误示例包括:

  • 无法加载正在访问的字典。
  • 查询 cached 字典时出错。

可以在 system.dictionaries 表中查看字典列表及其状态。