跳至主要内容

为什么我在 ClickHouse Cloud 中的字典里看不到我的数据?

·阅读时长 2 分钟

在 ClickHouse Cloud 中创建的字典在初始创建阶段可能会出现不一致。这意味着您可能在创建后立即看不到字典中的任何数据。但是,在多次重试后,创建查询可能会落在不同的副本上,并且数据将可见。

这有时会发生,因为字典是在部分到达服务器之前创建的。例如

2024-01-25 13:38:25.615837 - CREATE DICTIONARY received
2024-01-25 13:38:25.626468 - CREATE DICTIONARY finished
2024-01-25 13:38:25.733008 - Part all_0_0_0 downloaded

如您所见,部分只是在创建字典后到达。如果您使用的是 LIFETIME(MIN 0 MAX 0),那么这将是一个更大的问题,因为这意味着字典永远不会自动刷新。因此,字典将保持为空,直到执行命令 RELOAD DICTIONARIES

解决此问题的方法是在创建字典时使用 SELECT 查询,而不是指定源表,并启用设置 select_sequential_consistency=1

而不是指定源表

SOURCE(CLICKHOUSE(
table 'test.temp_title_table_1706189903924'
user default password 'PASSWORD'))

使用带有 select_sequential_consistency=1SELECT 查询

SOURCE(CLICKHOUSE(QUERY
'SELECT songTitle, mappedTitle
FROM test.temp_title_table_1706189903924
SETTINGS select_sequential_consistency=1' USER default PASSWORD ''))

为什么会出现此问题?

当您插入数据,然后创建或重新加载字典时,DDL 可能会在数据(或新数据)到达之前到达副本。这会导致字典在副本之间不一致。然后,根据接收查询的副本,您可能会得到不同的结果。

请注意,当您插入数据并立即从表中读取数据时,也会发生同样的事情。如果您从尚未复制数据的副本中读取,您将看不到新插入的数据。当您需要顺序一致性时,以性能为代价(这就是通常不建议使用它的原因),您可以启用 select_sequential_consistency

字典的情况有点棘手,因为字典不使用查询的设置,而是使用服务器的设置。因此,当将数据加载到字典中时,即使您 SET select_sequential_consistency=1,数据也可能在副本之间加载不一致。在字典源查询中指定 select_sequential_consistency=1 允许字典即使没有作为服务器设置全局启用,也能遵守此设置。