내 설정 :의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를 사용하려고합니다.
neo4j 셸 또는 콘솔에서 질문의 프로필을 작성하면 주목할만한 점이 있습니까? – jjaderberg
0 및 5000 건너 뛰기 쿼리 프로필을 추가했습니다. 결과에 많은 차이가있는 것 같지 않습니다. Top 함수의 제한 만. – voldomazta