Best practice per l'ottimizzazione delle query del grafico di Spanner

Questo documento descrive le best practice per l'ottimizzazione della query del grafico di Spanner rendimento, che includono le seguenti ottimizzazioni:

  • Evita una scansione completa della tabella di input per nodi e edge.
  • Riduci la quantità di dati che la query deve leggere dallo spazio di archiviazione.
  • Riduci le dimensioni dei dati intermedi.

Inizia dai nodi con una cardinalità inferiore

Scrivi l'esplorazione del percorso in modo che inizi con i nodi di cardinalità inferiore. Questo approccio mantiene ridotto l'insieme di risultati intermedi e velocizza le query dell'esecuzione.

Ad esempio, le seguenti query hanno la stessa semantica:

  • Percorso dell'edge in avanti:

    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;
    
  • Percorso dell'elemento perimetrale inverso:

    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;
    

Supponendo che il numero di persone con il nome Alex sia inferiore al numero bloccati, ti consigliamo di scrivere questa query nel futuro attraversamento bordo.

Partendo dai nodi a cardinalità più bassa è particolarmente importante attraversamento del percorso con lunghezza variabile. L'esempio seguente mostra il metodo consigliato per trovare gli account trasferiti in modo transitivo da un determinato account all'interno di tre salti.

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

Specifica tutte le etichette per impostazione predefinita

Il grafico Spanner deduce i nodi idonei e le etichette perimetrale se vengono omesse. Consigliamo di specificare le etichette per tutti i nodi e gli archi ove possibile, perché questa inferenza potrebbe non essere sempre possibile causare la scansione di più etichette del necessario.

Singola istruzione MATCH

L'esempio seguente trova gli account collegati da al massimo 3 trasferimenti dalla account specificato:

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

Nelle istruzioni CONFRONTA

Specifica le etichette su nodi ed archi quando fanno riferimento allo stesso elemento, ma si trovano in più istruzioni MATCH.

L'esempio seguente mostra questo approccio consigliato:

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;

Passaggi successivi