Best Practices für die Optimierung von Spanner-Graphabfragen

In diesem Dokument werden Best Practices für die Optimierung der Leistung von Spanner-Graphabfragen beschrieben. Dazu gehören die folgenden Optimierungen:

  • Vermeiden Sie einen vollständigen Scan der Eingabetabelle nach Knoten und Kanten.
  • Verringern Sie die Menge der Daten, die die Abfrage aus dem Speicher lesen muss.
  • Verringern Sie die Größe der Zwischendaten.

Mit Knoten mit niedrigerer Kardinalität beginnen

Schreiben Sie den Pfad so, dass er mit den Knoten mit der niedrigeren Kardinalität beginnt. So bleibt der Zwischenergebnissatz klein und die Abfrageausführung wird beschleunigt.

Die folgenden Abfragen haben beispielsweise dieselbe Semantik:

  • Vorwärtskantendurchlauf:

    GRAPH FinGraph
    MATCH (p:Person)-[:Owns]->(a:Account)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    
  • Rückwärtsgerichtete Kantendurchquerung:

    GRAPH FinGraph
    MATCH (a:Account)<-[:Owns]-(p:Person)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    

Angenommen, es gibt weniger Personen mit dem Namen Alex als blockierte Konten, empfehlen wir, diese Abfrage in der Vorwärtskantenüberprüfung zu schreiben.

Das ist besonders wichtig für die Pfaddurchquerung mit variabler Länge. Im folgenden Beispiel wird die empfohlene Methode zum Finden von Konten gezeigt, die sich innerhalb von drei Überweisungen von einem bestimmten Konto befinden.

GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;

Alle Labels standardmäßig angeben

Wenn Labels weggelassen werden, leitet Spanner Graph die entsprechenden Knoten und Kantenlabels ab. Wir empfehlen, nach Möglichkeit Labels für alle Knoten und Kanten anzugeben, da diese Inferenz möglicherweise nicht immer möglich ist und dazu führen kann, dass mehr Labels als nötig gescannt werden.

Einzelne MATCH-Anweisung

Im folgenden Beispiel werden Konten gefunden, die über maximal drei Überweisungen vom angegebenen Konto verknüpft sind:

GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;

In MATCH-Anweisungen

Geben Sie Labels für Knoten und Kanten an, wenn sie sich auf dasselbe Element beziehen, aber in verschiedenen MATCH-Anweisungen enthalten sind.

Das folgende Beispiel zeigt diesen empfohlenen Ansatz:

GRAPH FinGraph
MATCH (acct:Account {id: 7})-[:Transfers]->{1,3}(other_acct:Account)
RETURN acct, COUNT(DISTINCT other_acct) AS related_accts
GROUP BY acct

NEXT

MATCH (acct:Account)<-[:Owns]-(p:Person)
RETURN p.id AS person, acct.id AS acct, related_accts;

Nächste Schritte