管理查询中的内存

时间:2016-02-29 13:58:41

标签: tomcat7 orientdb orientdb-2.1

我的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会占用所有内存?关于分页的依赖性是否有列数?

1 个答案:

答案 0 :(得分:1)

尝试在没有Tomcat的情况下启动db orient,并验证:

SET INDEX

使用用于过滤查询中数据的字段的索引,将导致改进。 在OrientDB中,有各种类型的索引,每种索引在某些情况下都具有优势index。因此,索引选择取决于您的情况。 在我的测试中,我使用了'SB-TREE'。

enter image description here

验证ORIENTDB流程占用的内存

使用默认设置(OrientDB autoconfig DISKCACHE = 5.064MB(heap = 455MB),上传包含3个属性(id,name,city)的Person类的100,000个顶点,我有以下内存值:

  • 大小db = 80 MB
  • 查询= SELECT COUNT(@rid) FROM Person WHERE id >= 0
  • 时间查询执行=(冷)3.57秒。 (热)1.88秒
  • 验证查询使用了index = explain SELECT COUNT(@rid) FROM Person WHERE id >= 0,并检查“relatedIndexes”列下是否有您创建的索引(在我的情况下为[“Person.id”])
  • OrientDB进程(工作室打开)= 442 MB(命令: ps -ef | grep orient 你获得idprocess,然后: top -pYOUR_ID

时间查询: enter image description here

索引使用: enter image description here

orientdb的进程使用的RAM enter image description here

增加HEAP / DISKCACHE

如果你有“内存不足”,你可能会尝试增加堆:

  • 在orientdb位置的/ bin文件夹中打开文件Server.sh(对于linux)或server.bat(对于windows)。
  • 设置MAXHEAP = -Xmx2048m

如果使用索引后查询仍然很慢,则会增加缓存:

  • MAXDISKCACHE =“ - Dstorage.diskCache.bufferSize = 8192 FOR 8GB”

显然堆值和缓存取决于系统上有多少RAM。考虑到使用Ram增加太多,已经使操作系统已经饱和,而且更多,只会有缺点。

如果没有Tomcat运行,你是否仍然'内存不足'或者count()将返回值(足够快)?

如果到现在为止一切顺利,你可以启动Tomcat,看看它在2个进程(oriendb和tomcat)处于活动状态时的行为如何。 如果它未饱和,请尝试使用count()重新运行查询。 “失去记忆”? 使用活动的tomcat,您应该尝试重新设置内存,以便它对Tomcat和OrientDB都足够。 (还考虑操作系统使用的ram)。

修改

正确的方法是,如果您已经知道类中必须存在哪些属性,则立即创建属性,并在每个属性上创建其相对索引。这样,在添加顶点时,索引会在输入后自动更新。因此,当您运行查询时,您确定where子句中的过滤器将使用索引。