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

Clickhouse Dictionaries: why CREATE DICTIONARY needs a database?

ClickHouse 中的 new 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成语创建全局字典?

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

据我了解,您的问题是向后不兼容 xml-based 字典和 DDL 字典,因此解决它的唯一方法是添加 database-prefix(例如,如果它定义在 table 架构需要应用 ALTER TABLE MODIFY COLUMN-语句)。 为了轻松地从 xml- 迁移到 DDL-based 字典需要临时托管两种类型的字典(xml 和 DDL)并将所有消费者一一切换到 DDL 字典。


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