在内存中存储字典
有多种方法可以将字典存储在内存中。
我们建议 平, 散列 和 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)