2016-11-07 93 views
3

我的orientdb数据库拥有大约230万条记录。我试图查询所有重复记录(其中有大约750,000)使用声明 - SELECT FROM (select PROP1, PROP2, count(*) as c from vin_data group by PROP1) where c > 1。当我将限制设置为200左右时,大约需要180秒才能查询(我认为这很慢)。但是,当我将限制设置为750000时,它会给我带来内存不足的错误。我的内存是4GB,我已经设置了Xms64m和Xmx3600m。我已经设置了PROP1和PROP1 + PROP2(复合)的索引。我的问题是 - 对于230万个记录数据库,4GB内存足够了吗?Orientdb GC开销限制超出/内存不足错误和性能下降

回答

2

对于上面的查询,两个索引都毫无价值,因为它们不在GROUP BY中使用。没有任何“where”条件,整个班级都会被扫描。您可以尝试通过在语句末尾添加PARALLEL关键字来优化它。如果你有多个内核,它应该快得多。

无论如何,随着即将发布的v3.0版本(仍在alpha版本之前),新的SQL引擎中已经付出了很多努力,像你这样的查询应该快得多。

+0

我明白了。感谢您的回应。尽管我为了不同的目的而编制了我的课程。那么,考虑到查询的种类,占用4GB RAM的230万条记录是正常的?我现在的目的是从我的数据库中删除重复项。任何你可能会暗示的技巧可以加快我的查询速度? –

+0

顺便说一句,我在24 GB RAM的系统上执行查询,为Xmx分配20GB,并行化8个内核和SSD(如果有的话)。我仍然会超过GC的开销限制。我很确定这是不正常的。任何疑难解答建议?什么时候会发布v3.0? –

+0

不幸的是,'group by'和'order by'工作在RAM中。最终结果集中有多少条记录有多条记录分组?你可以执行这个'SELECT count(*)FROM(从PROP1选择PROP1,PROP2,count(*)作为来自vin_data组的c)其中c> 1'? – Lvca

相关问题