在内存中存储字典
有多种方法可以将字典存储在内存中。
我们建议 平, 散列 和 complex_key_hashed. 其提供最佳的处理速度。
不建议使用缓存,因为性能可能较差,并且难以选择最佳参数。 阅读更多的部分 “缓存”.
有几种方法可以提高字典性能:
- 调用该函数以使用后的字典 GROUP BY.
- 将要提取的属性标记为"注射"。 如果不同的属性值对应于不同的键,则称为注射属性。 所以当 GROUP BY使用由键获取属性值的函数,此函数会自动取出GROUP BY.
ClickHouse为字典中的错误生成异常。 错误示例:
- 无法加载正在访问的字典。
- 查询错误 cached字典
您可以查看外部字典的列表及其状态 system.dictionaries 桌子
配置如下所示:
<clickhouse>
    <dictionary>
        ...
        <layout>
            <layout_type>
                <!-- layout settings -->
            </layout_type>
        </layout>
        ...
    </dictionary>
</clickhouse>
相应的 DDL-查询:
CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- layout settings
...
在内存中存储字典的方法
平
字典以平面数组的形式完全存储在内存中。 字典使用多少内存? 量与最大键的大小(在使用的空间中)成正比。
字典键具有 UInt64 类型和值限制为500,000。 如果在创建字典时发现较大的键,ClickHouse将引发异常,不会创建字典。
支持所有类型的来源。 更新时,数据(来自文件或表)将完整读取。
此方法在存储字典的所有可用方法中提供了最佳性能。
配置示例:
<layout>
  <flat />
</layout>
或
LAYOUT(FLAT())
散列
该字典以哈希表的形式完全存储在内存中。 字典中可以包含任意数量的带有任意标识符的元素,在实践中,键的数量可以达到数千万项。
支持所有类型的来源。 更新时,数据(来自文件或表)将完整读取。
配置示例:
<layout>
  <hashed />
</layout>
或
LAYOUT(HASHED())
sparse_hashed
类似于 hashed,但使用更少的内存,有利于更多的CPU使用率。
配置示例:
<layout>
  <sparse_hashed />
</layout>
LAYOUT(SPARSE_HASHED())
complex_key_hashed
这种类型的存储是用于复合 键. 类似于 hashed.
配置示例:
<layout>
  <complex_key_hashed />
</layout>
LAYOUT(COMPLEX_KEY_HASHED())
range_hashed
字典以哈希表的形式存储在内存中,其中包含有序范围及其相应值的数组。
此存储方法的工作方式与散列方式相同,除了键之外,还允许使用日期/时间(任意数字类型)范围。
示例:该表格包含每个广告客户的折扣,格式为:
+---------|-------------|-------------|------+
| advertiser id | discount start date | discount end date | amount |
+===============+=====================+===================+========+
| 123           | 2015-01-01          | 2015-01-15        | 0.15   |
+---------|-------------|-------------|------+
| 123           | 2015-01-16          | 2015-01-31        | 0.25   |
+---------|-------------|-------------|------+
| 456           | 2015-01-01          | 2015-01-15        | 0.05   |
+---------|-------------|-------------|------+
要对日期范围使用示例,请定义 range_min 和 range_max 中的元素 结构. 这些元素必须包含元素 name 和type (如果 type 如果没有指定,则默认类型将使用-Date)。 type 可以是任何数字类型(Date/DateTime/UInt64/Int32/others)。
示例:
<structure>
    <id>
        <name>Id</name>
    </id>
    <range_min>
        <name>first</name>
        <type>Date</type>
    </range_min>
    <range_max>
        <name>last</name>
        <type>Date</type>
    </range_max>
    ...
或
CREATE DICTIONARY somedict (
    id UInt64,
    first Date,
    last Date
)
PRIMARY KEY id
LAYOUT(RANGE_HASHED())
RANGE(MIN first MAX last)