Clickhouse 外部词典 returns 不一致的结果
Clickhouse external dictionary returns inconsistent results
我们有一个字典,其来源是外部 postgres,布局是 complex_key_cache
,lifetime
是 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 缓存的行。
我们有一个字典,其来源是外部 postgres,布局是 complex_key_cache
,lifetime
是 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 缓存的行。