问题明显不同?

时间:2017-05-10 23:29:13

标签: cratedb

在我的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(*)不是?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

计数是一种非常轻量级的操作,因为只需要一个数字(长整数),每行都会递增。而对于不同的计数,所有值必须保存在内存中,以便能够确定某个值是否已存在(无增量)或是否为新值(增量计数器)。

要绕过CircuitBreakingException(顺便说一下,从一个被卡住的节点中保存你,否则会抛出OutOfMemory而你的节点将无法使用),增加crate进程的HEAP。 如何设置HEAP大小取决于使用的分布,通常可以使用CRATE_HEAP_SIZE环境变量。

增加HEAP还可以通过查询为您的第一组提供更好的性能。一个好的规则是给crate 50%的可用内存,所以其他50%可以被OS文件系统缓存使用(这也可以从中受益)。