我正在使用新的bolt客户端对neo4j 3.0.7进行性能测试,我看到了一些奇怪的结果。 我尝试了一个非常简单的场景:upserting 1000个节点(使用merge命令)。
我尝试了几种方法:
这是我正在执行的查询(我对person.id有唯一性约束): "合并(n:person {id:' 123'})SET n.name =' Diana Kesha',n.address =' aaa' ....返回n.id"
以下是我的查询的执行计划:
结果如下:
对于配备128G RAM机器的64核心来说,这是绝对不可接受的结果!
现在,深入一点, 我注意到Neo4j使用了25%的RAM(我认为这很好),但在使用前2个选项时仅使用 1 核心,在使用10个线程时使用10个核心。
我也注意到改变Neo4j的工作线程并没有影响使用的实际内核数量。
我错过了什么?
答案 0 :(得分:1)
你有两个相互矛盾的数字,你的意思是1000还是1000k = 1M?
1M更新的2秒太慢了?
我建议每个tx进行1k到10k的更新,然后并行化tx
像:
MERGE (n:Person {id:{id}})
ON CREATE SET n.name={name} n.address={address}
最好将(2)批处理为列表参数
UNWIND {data} as row
MERGE (n:Person {id:row.id})
ON CREATE SET n.name=row.name n.address=row.address
因此,测试1000个请求(并行),每个请求1000个更新,每次发送一个包含1000个映射的列表。
UNWIND {data} as row
MERGE (n:Person {id:row.id})
ON CREATE SET n.name=row.name n.address=row.address