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. Dieser Ansatz hält die Zwischenergebnismenge gering und beschleunigt die Abfrage Ausführung.
Die folgenden Abfragen haben beispielsweise die gleiche Semantik:
Forward Edge Traversal:
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 tatsächlich
gesperrte Konten zu erstellen, sollten Sie diese Abfrage in die
Edge Traversal.
Das ist besonders wichtig für die Pfaddurchquerung mit variabler Länge. Im folgenden Beispiel wird die empfohlene Vorgehensweise zum Suchen von Konten veranschaulicht, die innerhalb von drei Hops transitive Übertragungen von einem bestimmten Konto erhalten.
GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;
Alle Labels standardmäßig angeben
Spanner Graph leitet die qualifizierenden Knoten und Edge-Labels ab, wenn Labels werden weggelassen. Es wird empfohlen, Labels für alle Knoten und Kanten anzugeben. da diese Inferenz nicht immer möglich ist und 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 Beschriftungen für Knoten und Kanten an, wenn diese auf dasselbe Element verweisen, jedoch
für MATCH
-Anweisungen.
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;