Clickhouse 外部词典 returns 不一致的结果

Clickhouse external dictionary returns inconsistent results

我们有一个字典,其来源是外部 postgres,布局是 complex_key_cachelifetime 是 3600-7200。

当我做的时候

select * from dictionaries.dictname limit 5

我只得到了一些结果(少于 5 个,我认为 dict 大约有 10k 行)。但如果我这样做

SELECT dictGet('dictname', 'catId', tuple('somestring'))

然后假设密钥存在,我总能得到结果。在接下来对 select * 的一些调用中,我将返回该行(键 somestring)。

这个查询也是如此

SELECT d,
       catId,
       dictGet('dictname', 'catId', tuple(base64Decode(d))) AS categoryId
  FROM dictionaries.dictname

我只得到一些结果 - 可能是缓存中的结果。

所以 2 个问题:

如何确保在给定列表的情况下获得所有结果?例如

SELECT d,
       catId
  FROM dictionaries.dictname d
 WHERE d in ('somestring', 'anotherstring')

为什么会这样?为什么 single dictGet 似乎有效(不使用缓存?)但是当我尝试使用 IN 运算符或 dictGet 加入使用 dict table 它不起作用(似乎使用某种缓存)?

据我了解,由于此字典使用 complex_key_cache clickhouse 仅在不过滤时使用缓存(例如列出字典中的所有键)并在 过滤时使用缓存和源 结果。

此查询在 FROM 子句中使用缓存字典,因此过滤应用于缓存字典:

SELECT d,
       catId
  FROM dictionaries.dictname d
 WHERE d in ('somestring', 'anotherstring') 

但如果我们这样做

SELECT d,
       dictGet('dictname', 'category_id', tuple(d)) AS categoryId
  FROM (
        SELECT ['somestring', 'anotherstring'] AS d
       ) ARRAY
  JOIN d

如果在缓存中找不到密钥,它会强制 dictGet 转到源。

是的。对于缓存字典,字典 table 仅反映 dictGet 缓存的行。