Dokumen ini menjelaskan praktik terbaik untuk menyesuaikan performa kueri Spanner Graph, yang mencakup pengoptimalan berikut:
- Hindari pemindaian penuh tabel input untuk node dan edge.
- Kurangi jumlah data yang perlu dibaca kueri dari penyimpanan.
- Mengurangi ukuran data perantara.
Mulai dari node kardinalitas yang lebih rendah
Tulis traversal jalur sehingga dimulai dengan node kardinalitas yang lebih rendah. Pendekatan ini membuat kumpulan hasil perantara tetap kecil, dan mempercepat eksekusi kueri.
Misalnya, kueri berikut memiliki semantik yang sama:
Penjelajahan tepi maju:
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;
Traversal tepi terbalik:
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;
Dengan asumsi bahwa ada lebih sedikit orang dengan nama Alex
daripada
akun yang diblokir, sebaiknya tulis kueri ini di traversal
edge maju.
Memulai dari node kardinalitas yang lebih rendah sangat penting untuk traversal jalur panjang variabel. Contoh berikut menunjukkan cara yang direkomendasikan untuk menemukan akun yang ditransfer secara transitif dari akun tertentu dalam tiga hop.
GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;
Menentukan semua label secara default
Spanner Graph menyimpulkan node dan label tepi yang memenuhi syarat jika label dihilangkan. Sebaiknya tentukan label untuk semua node dan tepi jika memungkinkan, karena inferensi ini mungkin tidak selalu dapat dilakukan dan dapat menyebabkan lebih banyak label daripada yang diperlukan untuk dipindai.
Satu pernyataan MATCH
Contoh berikut menemukan akun yang ditautkan oleh maksimal 3 transfer dari akun yang diberikan:
GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;
Di seluruh pernyataan MATCH
Tentukan label pada node dan edge jika merujuk ke elemen yang sama, tetapi
terdapat di seluruh pernyataan MATCH
.
Contoh berikut menunjukkan pendekatan yang direkomendasikan ini:
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;