Neo4j - 查询性能下降
Neo4j - query performance degradation
这是我的查询:
MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)-[s:AUTHORED]-(a:Author)
MATCH (l:Language)-[t:USED]->(w:Woka)
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*')
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name;
第一次执行3.8秒返回结果。几分钟后第二次执行,结果在 15.1 秒内返回。我执行的越多,响应时间就越长。对于第三次执行,响应时间在增加,几分钟后我得到的结果在 30 到 90 秒之间。
我是这个(开发)数据库的唯一用户。那里没有添加、删除或更改任何数据。那里也没有删除或创建索引。
当关闭与数据库的三个连接中的两个时,响应时间回到 15 秒。
初始内存设置为 4GB,最大为 8GB。服务器有 16GB 总内存。
这里发生了什么?为什么响应时间相差这么大?
你的图表有多大?可能是它为缓存分配了大量堆,然后没有足够的 space 用于 运行 没有垃圾收集的查询。
我假设你们的关系都是1:n,如果不是的话在两个匹配之间添加一个WITH distinct p,w,a
。
您的查询也不是最优的,可能会产生很多中间结果,您可以使用PROFILE
查看查询计划。
试试这个:
PROFILE
MATCH (a:Author)
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*')
MATCH (p:Publisher)-[:PUBLISHED]->(w:Woka)<-[:AUTHORED]-(a)
MATCH (l:Language)-[:USED]->(w:Woka)
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name;
我借鉴了其他解决方案,并在文件 conf/neo4j.properties 中更改了如下参数(之后服务器重新启动):
neostore.nodestore.db.mapped_memory=512M
neostore.relationshipstore.db.mapped_memory=512M
neostore.propertystore.db.mapped_memory=512M
neostore.propertystore.db.strings.mapped_memory=512M
neostore.propertystore.db.arrays.mapped_memory=512M
现在返回结果的速度平均快了 300%,时间从 90 秒缩短到 30 秒,而且我不再从 Web 界面与数据库断开连接。
这是我的查询:
MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)-[s:AUTHORED]-(a:Author)
MATCH (l:Language)-[t:USED]->(w:Woka)
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*')
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name;
第一次执行3.8秒返回结果。几分钟后第二次执行,结果在 15.1 秒内返回。我执行的越多,响应时间就越长。对于第三次执行,响应时间在增加,几分钟后我得到的结果在 30 到 90 秒之间。
我是这个(开发)数据库的唯一用户。那里没有添加、删除或更改任何数据。那里也没有删除或创建索引。 当关闭与数据库的三个连接中的两个时,响应时间回到 15 秒。
初始内存设置为 4GB,最大为 8GB。服务器有 16GB 总内存。
这里发生了什么?为什么响应时间相差这么大?
你的图表有多大?可能是它为缓存分配了大量堆,然后没有足够的 space 用于 运行 没有垃圾收集的查询。
我假设你们的关系都是1:n,如果不是的话在两个匹配之间添加一个WITH distinct p,w,a
。
您的查询也不是最优的,可能会产生很多中间结果,您可以使用PROFILE
查看查询计划。
试试这个:
PROFILE
MATCH (a:Author)
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*')
MATCH (p:Publisher)-[:PUBLISHED]->(w:Woka)<-[:AUTHORED]-(a)
MATCH (l:Language)-[:USED]->(w:Woka)
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name;
我借鉴了其他解决方案,并在文件 conf/neo4j.properties 中更改了如下参数(之后服务器重新启动):
neostore.nodestore.db.mapped_memory=512M
neostore.relationshipstore.db.mapped_memory=512M
neostore.propertystore.db.mapped_memory=512M
neostore.propertystore.db.strings.mapped_memory=512M
neostore.propertystore.db.arrays.mapped_memory=512M
现在返回结果的速度平均快了 300%,时间从 90 秒缩短到 30 秒,而且我不再从 Web 界面与数据库断开连接。