使用Match进行count操作

提问参考模版:

  • nebula 版本:2.5.0
  • 部署方式:集群部署,3台机器
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘:机械硬盘300G
    • CPU、内存信息:4核8G
  • 问题的具体描述
    在创建好的tag中导入了大概160万数据,然后执行了:
    match(v:s) return count(v);
    返回:
    2021/09/09 16:05:40 [ERROR] Failed to reconnect, failed to open transport, error: dial tcp xxxxx:9669: connectex: No connection could be made because the target machine actively refused it.
    2021/09/09 16:05:40 Loop error, failed to open transport, error: dial tcp xxxxx:9669: connectex: No connection could be made because the target machine actively refused it.

Bye root!
Thu, 09 Sep 2021 16:05:40 CST

到机器上看,发现graphd的进行被kill了,导致客户端也连接不上了
请问下这是什么原因?有什么排查方式?

你导入之后创建索引了吗?

我在导入之前,已经将tag中的一个属性创建了索引

tag 是 s 吗?我看你的语句是用 s 来检索的

这里的tag名称,是我脱敏后随便填入的,你可以理解为:获取tag为s的数据量

升级机器配置为:16G和300GSSD,执行这个count操作,内存还是提示不够

1、 dmsg一下, 看看是不是oom了
2、看一下 graphd-stderr.log 或者nebula-graphd.ERROR 日志有啥错误打印没

升级机器配置后,现在返回错误是:
[ERROR (-1005)]: Used memory(13658460KB) hits the high watermark(0.800000) of total system memory(16266176KB).

看样子就是因为内存不够导致的,nebula对内存的要求这么高的吗?我这个tag下insert了大概160w数据,我只是想统计一下这个tag下具体的数据量而已

统计数量 可以使用 1、 submit job stats 然后 show stats 查看每个tag的数量

因为 match(v) return count(v) 会把 所有的点和属性全部扫描出来,传送给graph ,然后再统计. 这个已经在优化了,会把统计信息 下推到storage

好的,我尝试了下,确实统计出了每个tag的数据量,十分感谢 :smiling_face_with_three_hearts:

你好,再请问一下,如果我想清除一个tag下面的所有数据,应该怎样操作呢?

https://docs.nebula-graph.com.cn/2.5.0/3.ngql-guide/10.tag-statements/2.drop-tag/

1 个赞

好的,我想起这个了,感谢 :smiling_face_with_three_hearts:

你好,我这边有个场景,就是通过条件帅选出数据,然后进行统计,比如:
match (v:s) where v.name == “ni” return count(v),这样一个查询语句,用你刚才说的job的方式,是不是就没法解决了?这样的count,是不是也会造成OOM的情况?

这样 应该不会,但是要对 v.name 建立索引

多个字段的话,是每个字段都需要建立索引吗?

最好是 使用 where id(v) == “xxx”. 次之 是 where v.name == “xxx”, 多个字段的话,要建立 组合索引(不能跨tag) , 可以看一下文档

1 个赞

好的,了解了,感谢 :wink:

如果你的问题解决了的话,可以勾选你觉得解决你问题的回复为【解决方案】让后续的小伙伴能一眼看到解决方法哈~