2017-10-23 3 views
3

Ich bin neu in ArangoDB, Probleme bei der Optimierung meiner Abfragen und hoffe auf etwas Hilfe.ArangoDB langsame Abfrage

Die Abfrage, die ich unten zur Verfügung gestellt habe ein echtes Beispiel dafür ist, dass ich mit, 758,078 ms auf meiner dev Datenbank, sondern auf Inszenierung, mit einer viel größeren Datenmenge bin zu kämpfen, dauert es 531,511 s.

Ich werde auch die Größe der einzelnen Kantentabellen bereitstellen, die ich in Dev und Staging durchquere. Jede Hilfe wird wirklich geschätzt.

for doc in document 
filter repo._key == "my-key" 
    for v, e, p in 3 any doc edge1, edge2, edge3 
    options {uniqueVertices: 'global', bfs: true} 
    filter DATE_ISO8601(p.vertices[2].date) > DATE_ISO8601("2017-09-04T00:00:01Z") 
     and DATE_ISO8601(p.vertices[2].date) < DATE_ISO8601("2017-09-15T23:59:59Z") 
    limit 1 
    return { 
     commit: p.vertices[2].hash, 
     date: p.vertices[2].date, 
     message: p.vertices[2].message, 
     author: p.vertices[1].email, 
     loc: p.vertices[3].stats.additions 
    } 

DEV

  • edge1: 2638
  • Flanke2: 2560
  • edge3: 386

STAGING

  • edge1: 5.438.811
  • Flanke2: 5.544.028
  • edge3: 423.545

Antwort

1

Die Abfrage ist möglicherweise langsam, da die Filterbedingung

filter 
    DATE_ISO8601(p.vertices[2].date) > DATE_ISO8601("2017-09-04T00:00:01Z" 
and 
    DATE_ISO8601(p.vertices[2].date) < DATE_ISO8601("2017-09-15T23:59:59Z") 

nicht während der Traversal angewendet wird, sondern erst danach . Dies liegt möglicherweise an den Funktionsaufrufen (an DATE_ISO8601) in den Filterbedingungen. Wenn Sie das Datum Wert als Zahlen gespeichert ist, können Sie überprüfen, ob die folgende Filterbedingung die Abfrage beschleunigt:

filter 
    p.vertices[2].date > DATE_TIMESTAMP("2017-09-04T00:00:01Z" 
and 
    p.vertices[2].date < DATE_TIMESTAMP("2017-09-15T23:59:59Z") 

Die Filterbedingung geändert ermöglichen sollte, die Filterbedingung in der Traversal ziehen, so dass es früher ausgeführt wird.

Sie können die Abfrageausführungspläne mithilfe von db._explain(<query string goes here>); in der ArangoShell oder über den AQL-Editor der Weboberfläche überprüfen.

+0

Hey, vielen Dank. Wie würde ich meinen Filter auf die Traversierung anwenden? Ich weiß nicht, dass ich ein Beispiel dafür gesehen habe, also bin ich mir nicht sicher, wie ich diesen Teil der Abfrage restrukturieren soll. –

+1

Ich denke, Sie können nur Ihre Filterbedingung durch die, die ich vorgeschlagen, ersetzen. Dies funktioniert jedoch nur, wenn Ihre Datumswerte als Zahlen gespeichert sind. Sie können dann den Ausführungsplan der Abfrage über die Webschnittstelle überprüfen. Der Ausführungsplan sollte sich in dem Sinne ändern, dass im Abschnitt "Traversals" unten der Filterzustand angezeigt werden sollte. Während in der ursprünglichen Abfrage die Filterbedingung nicht im Abschnitt "Traversals" angezeigt werden sollte. – stj