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 同时具有 WHERE 和 PREWHERE 构造?