我的OrientDB架构中有一个大表(很多列和一些行)。
(列早35000,行早100.000)。
当我尝试使用简单的COUNT查询我的表时,如下所示:
SELECT COUNT(@rid) FROM myTable WHERE filters
我的进程占用8 GB的早期内存。
如果我尝试使用索引表示法重写我的查询,请执行以下操作:
SELECT COUNT(@rid) FROM index:myIndex WHERE key = [value1, ... valueN]
我的进程占用8 GB的早期内存。
第一个问题:
我保留了Orient 8 GB的内存,对于应用服务器,我必须保留相同的内存吗?因为,使用Orient的DISK CACHE属性,其内存管理,可以,但在应用服务器(Tomcat)下我出现内存不足错误。
第二个问题:
为什么简单的COUNT会占用所有内存?关于分页的依赖性是否有列数?
答案 0 :(得分:1)
尝试在没有Tomcat的情况下启动db orient,并验证:
SET INDEX
使用用于过滤查询中数据的字段的索引,将导致改进。 在OrientDB中,有各种类型的索引,每种索引在某些情况下都具有优势index。因此,索引选择取决于您的情况。 在我的测试中,我使用了'SB-TREE'。
验证ORIENTDB流程占用的内存
使用默认设置(OrientDB autoconfig DISKCACHE = 5.064MB(heap = 455MB),上传包含3个属性(id,name,city)的Person类的100,000个顶点,我有以下内存值:
SELECT COUNT(@rid) FROM Person WHERE id >= 0
explain SELECT COUNT(@rid) FROM Person WHERE id >= 0
,并检查“relatedIndexes”列下是否有您创建的索引(在我的情况下为[“Person.id”])增加HEAP / DISKCACHE
如果你有“内存不足”,你可能会尝试增加堆:
如果使用索引后查询仍然很慢,则会增加缓存:
显然堆值和缓存取决于系统上有多少RAM。考虑到使用Ram增加太多,已经使操作系统已经饱和,而且更多,只会有缺点。
如果没有Tomcat运行,你是否仍然'内存不足'或者count()将返回值(足够快)?
如果到现在为止一切顺利,你可以启动Tomcat,看看它在2个进程(oriendb和tomcat)处于活动状态时的行为如何。 如果它未饱和,请尝试使用count()重新运行查询。 “失去记忆”? 使用活动的tomcat,您应该尝试重新设置内存,以便它对Tomcat和OrientDB都足够。 (还考虑操作系统使用的ram)。
修改强>
正确的方法是,如果您已经知道类中必须存在哪些属性,则立即创建属性,并在每个属性上创建其相对索引。这样,在添加顶点时,索引会在输入后自动更新。因此,当您运行查询时,您确定where子句中的过滤器将使用索引。