Clickhouse 词典:为啥 CREATE DICTIONARY 需要数据库?

Posted

技术标签:

【中文标题】Clickhouse 词典:为啥 CREATE DICTIONARY 需要数据库?【英文标题】:Clickhouse Dictionaries: why CREATE DICTIONARY needs a database?Clickhouse 词典:为什么 CREATE DICTIONARY 需要数据库? 【发布时间】:2020-10-01 15:43:07 【问题描述】:

ClickHouse 中的CREATE DICTIONARY 成语将在数据库中创建字典:

CREATE DICTIONARY [IF NOT EXISTS] [db.]dictionary_name [ON CLUSTER cluster]

由 XML 文件创建的字典被创建为空字符串数据库:

<dictionaries>
  <dictionary>
  <name>rates</name>
  <source>
  ...
</dictionaries>

它们会在 system.dictionaries 上生成一个条目,如下所示:

:) select * from system.dictionaries \G
...
Row 4:
──────
database:                    
name:                        rates

空字符串数据库,理解为全局字典,无需数据库前缀即可引用。

但是,对于CREATE DICTIONARY SQL 习惯用法,如果未指定db,则在default 数据库中创建DICTIONARY,而不是作为全局字典:

:) CREATE DICTIONARY IF NOT EXISTS rates (...)

:) select * from system.dictionaries \G

Row 2:
──────
database:                    default
name:                        rates

问题:有没有办法通过 SQL 成语创建全局字典?

【问题讨论】:

【参考方案1】:

DDL 字典不能驻留在全局范围内,因为它在 DDL 方面不存在。

据我了解,您的问题是基于 xml 的字典和 DDL 的向后不兼容,因此修复它的唯一方法是添加数据库前缀(例如,如果它在表模式中定义,则需要应用 @987654321 @-陈述)。 要从基于 xml 的字典轻松迁移到基于 DDL 的字典,需要临时托管两种类型的字典(xml 和 DDL),并将所有消费者一一切换到 DDL 字典。


DDL 字典比基于 xml 的字典更易于维护和灵活,因为:

无需接触 xml 文件即可轻松管理(添加、删除等) ON CLUSTER-clause 允许在指定集群的所有服务器上执行一些操作 管理访问privileges 从v20.4.2.9, 2020-05-12 开始的字典可以有效地用于JOIN 子句而不是dictGet(参见Altinity: Clickhouse Dictionaries Reloaded) 将其用作序数表

【讨论】:

以上是关于Clickhouse 词典:为啥 CREATE DICTIONARY 需要数据库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥clickhouse写批记录慢?

为啥修改表格列clickhouse时出现错误

为啥字段类型不一样,clickhouse查询结果不一样

为啥 clickhouse 同时具有 WHERE 和 PREWHERE 构造?

为啥 clickhouse 'DESCRIBE TABLE' 返回 4 或 5 列

为啥最近的主机名负载平衡配置在 ClickHouse 中不起作用?