Dokumen ini menjelaskan praktik terbaik untuk menyesuaikan kueri Grafik Spanner performa, 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 path traversal agar dimulai dengan node kardinalitas yang lebih rendah. Pendekatan ini membuat kumpulan hasil perantara tetap kecil, dan mempercepat kueri dalam proses eksekusi.
Misalnya, kueri berikut memiliki semantik yang sama:
{i>Forward edge traversal<i} (traversal 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;
Reverse edge traversal:
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
dibandingkan dengan yang ada
akun yang diblokir, sebaiknya Anda menulis kueri ini di kolom
{i>edge traversal<i}.
Memulai dari node kardinalitas yang lebih rendah sangat penting untuk {i>variabel-length path traversal<i}. 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;
Tentukan semua label secara default
Spanner Graph menyimpulkan node dan label edge yang memenuhi syarat jika label dihilangkan. Sebaiknya tentukan label untuk semua node dan tepi jika memungkinkan, karena inferensi ini mungkin tidak selalu menyebabkan lebih banyak label dari yang dibutuhkan untuk dipindai.
Satu pernyataan MATCH
Contoh berikut menemukan akun yang ditautkan dengan 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
Menentukan label pada node dan edge jika merujuk pada elemen yang sama tetapi
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;