在我的Crate.io数据库中,我有一个目前有50行mio,大小为16GB的表。 如果我尝试使用以下语句获得每日的条目数量一切正常(除了性能,但这不应该是目前的问题):
{ "function": {"arg1": 45, "arg2": 73}}
但是,如果我试图在另一个专栏上做一个明显的:
SELECT
date_format('%Y-%m-%d', date_trunc('day', "days")) AS "Day",
count(*) AS "Count"
FROM "doc"."mytable"
WHERE
date_format('%Y-%m-%d', date_trunc('day', "days")) BETWEEN date_format('%Y-%m-%d', date_trunc('day', current_timestamp + -2592000000))
AND date_format('%Y-%m-%d', date_trunc('day', current_timestamp + -86400000))
GROUP BY date_format('%Y-%m-%d', date_trunc('day', "days"))
ORDER BY date_format('%Y-%m-%d', date_trunc('day', "days")) ASC limit 100;
语句将失败
SQLActionException [CircuitBreakingException:[query]数据太大,[collect:0]的数据大于[1267571097 / 1.1gb]的限制
有没有人知道为什么COUNT(DISTINCT col)有太多数据的问题,但COUNT(*)不是?我该如何解决这个问题?
答案 0 :(得分:0)
计数是一种非常轻量级的操作,因为只需要一个数字(长整数),每行都会递增。而对于不同的计数,所有值必须保存在内存中,以便能够确定某个值是否已存在(无增量)或是否为新值(增量计数器)。
要绕过CircuitBreakingException(顺便说一下,从一个被卡住的节点中保存你,否则会抛出OutOfMemory而你的节点将无法使用),增加crate进程的HEAP。 如何设置HEAP大小取决于使用的分布,通常可以使用CRATE_HEAP_SIZE环境变量。
增加HEAP还可以通过查询为您的第一组提供更好的性能。一个好的规则是给crate 50%的可用内存,所以其他50%可以被OS文件系统缓存使用(这也可以从中受益)。