跳到主要内容

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

·2 分钟阅读
存在一个问题,即在创建字典后,字典中的数据可能不会立即显示。

ClickHouse 中的字典

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

有时发生这种情况是因为字典是在 part 到达服务器之前创建的。例如

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

如您所见,part 仅在字典创建后才到达。如果您使用 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 允许字典遵守此设置,即使它未作为服务器设置全局启用。