2013-10-25 3 views
4

내 설정 :의Neo4j 증가 지연

START n=node(*) RETURN COUNT(n); 
START r=relationship(*) RETURN count(r); 

크기 :

Java(TM) SE Runtime Environment (build 1.7.0_45-b18) 
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) 
Neo4j 2.0.0-M06 Enterprise 

먼저 나는 다음을 실행하여 캐시를 예열 확인했다 표는 63,677 노드와 7,169,995 관계 지금

이다 나는 다음과 같은 쿼리가 :

이 UID에는 약 40k + 페이지 매김을 할 수있는 결과가 있습니다. 초기 건너 뛰기는 773ms입니다. 나는 페이지 2 (건너 뛰기 25)를 시도했고 레이턴시는 심지어 페이지 500까지 동일했다. 단지 900ms까지 올라 갔다. 그래서 나는 정말로 신경 쓰지 않았다. 지금 나는 어떤 빠른 앞으로 페이징을 시도하고 1000, 2000, 3000을 했으므로 수천 명의 사람들이 뛰어 올랐다. 나는 ORDER BY 배열이 Neo4j에 의해 이미 캐시되고 SKIP을 사용하면 결과에서 그 인덱스로 이동하고 실 거예요. 다시 한 번 반복해야합니다. 그러나 각 천 건너 뛰기마다 대기 시간이 길어졌습니다. 도대체 원하는 것이 지금

SKIP 0: 773ms 
SKIP 1000: 1369ms 
SKIP 2000: 2491ms 
SKIP 3000: 3899ms 
SKIP 4000: 5686ms 
SKIP 5000: 7424ms 

: 이미 캐시와 두 예열 하나, 내가 시도 같은 각 건너에 대한 몇 번을 건너 뛰고이 같은 결과를 산출하기 때문에 그냥 캐시 온난화 아니다 결과 5000 페이지를 볼 수 있습니까? 40k도! :) 좋은 지적! 나는 아마도 사용자가 볼 수있는 최대 결과에 상한을 두 겠지만 나는이 현상에 대해서 궁금해했다. Neo4j가 이미 알고있는 것으로 보이는 것을 반복하는 이유를 설명해 주시겠습니까?

==> ColumnFilter(symKeys=["uid", " INTERNAL_AGGREGATE65c4d6a2-1930-4f32-8fd9-5e4399ce6f14"], returnItemNames=["uid", "total"], _rows=25, _db_hits=0) 
==> Slice(skip="Literal(0)", _rows=25, _db_hits=0) 
==> Top(orderBy=["SortItem(Cached( INTERNAL_AGGREGATE65c4d6a2-1930-4f32-8fd9-5e4399ce6f14 of type Any),false)"], limit="Add(Literal(0),Literal(25))", _rows=25, _db_hits=0) 
==>  EagerAggregation(keys=["uid"], aggregates=["( INTERNAL_AGGREGATE65c4d6a2-1930-4f32-8fd9-5e4399ce6f14,Sum(have))"], _rows=41659, _db_hits=0) 
==>  ColumnFilter(symKeys=["have", "u1", "uid", "c", "h", "w", "u2"], returnItemNames=["uid", "have"], _rows=146826, _db_hits=0) 
==>   Extract(symKeys=["u1", "c", "h", "w", "u2"], exprKeys=["uid", "have"], _rows=146826, _db_hits=587304) 
==>   Filter(pred="((NOT(Product(u2,uid(0),true) == Literal(39)) AND hasLabel(u1:user(0))) AND hasLabel(u2:user(0)))", _rows=146826, _db_hits=146826) 
==>    TraversalMatcher(trail="(u1)-[w:WANTS WHERE (hasLabel(NodeIdentifier():card(1)) AND hasLabel(NodeIdentifier():card(1))) AND true]->(c)<-[h:HAS WHERE (NOT(Product(NodeIdentifier(),uid(0),true) == Literal(39)) AND hasLabel(NodeIdentifier():user(0))) AND true]-(u2)", _rows=146826, _db_hits=293696) 

그리고 5000 스킵에 대한 :

==> ColumnFilter(symKeys=["uid", " INTERNAL_AGGREGATE99329ea5-03cd-4d53-a6bc-3ad554b47872"], returnItemNames=["uid", "total"], _rows=25, _db_hits=0) 
==> Slice(skip="Literal(5000)", _rows=25, _db_hits=0) 
==> Top(orderBy=["SortItem(Cached( INTERNAL_AGGREGATE99329ea5-03cd-4d53-a6bc-3ad554b47872 of type Any),false)"], limit="Add(Literal(5000),Literal(25))", _rows=5025, _db_hits=0) 
==>  EagerAggregation(keys=["uid"], aggregates=["( INTERNAL_AGGREGATE99329ea5-03cd-4d53-a6bc-3ad554b47872,Sum(have))"], _rows=41659, _db_hits=0) 
==>  ColumnFilter(symKeys=["have", "u1", "uid", "c", "h", "w", "u2"], returnItemNames=["uid", "have"], _rows=146826, _db_hits=0) 
==>   Extract(symKeys=["u1", "c", "h", "w", "u2"], exprKeys=["uid", "have"], _rows=146826, _db_hits=587304) 
==>   Filter(pred="((NOT(Product(u2,uid(0),true) == Literal(39)) AND hasLabel(u1:user(0))) AND hasLabel(u2:user(0)))", _rows=146826, _db_hits=146826) 
==>    TraversalMatcher(trail="(u1)-[w:WANTS WHERE (hasLabel(NodeIdentifier():card(1)) AND hasLabel(NodeIdentifier():card(1))) AND true]->(c)<-[h:HAS WHERE (NOT(Product(NodeIdentifier(),uid(0),true) == Literal(39)) AND hasLabel(NodeIdentifier():user(0))) AND true]-(u2)", _rows=146826, _db_hits=293696) 

유일한 차이점은 상위 기능에 LIMIT 절입니다

다음은 0 스킵 내 프로파일입니다. 이 작업을 의도대로 할 수 있기를 바랍니다. 웹 응용 프로그램에 내장 된 Neo4j + 내 Jetty REST API를 사용하려고합니다.

+0

neo4j 셸 또는 콘솔에서 질문의 프로필을 작성하면 주목할만한 점이 있습니까? – jjaderberg

+0

0 및 5000 건너 뛰기 쿼리 프로필을 추가했습니다. 결과에 많은 차이가있는 것 같지 않습니다. Top 함수의 제한 만. – voldomazta

답변

2

결과가 캐시되지 않습니다. 그렇지 않으면 서버 내부의 많은 메모리가 사용되지 않을 가능성이 높습니다.

정확하게 말하면 사람들은 대부분 처음 또는 처음 두 페이지에 관심을 갖고 검색을 수정합니다.

예측 가능한 페이징 성능이 더 필요하면 전나무 장소에서 네오에서 더 많은 결과를 가져 와서 사용자 세션에 고정시키고 거기에서 제공하십시오. 데이터베이스 (예 : 사용자 행동 프로파일 또는 파워 사용자 플래그 등)보다 훨씬 더 많은 컨텍스트 정보로이를 수행 할 수 있습니다.

+0

나는 너무 많이 물었을지도 모른다는 것에 동의한다. 결과를 MongoDB 컬렉션으로 가져 와서 집계 값에 대한 인덱스를 가지고있는 것이 좋다고 생각하지 않습니다. 거기에 결과를 캐시하고 사용자가 5 분 내에 새로운 결과를 가져 오게 할 수 있습니다. – voldomazta