本文將說明調整 Spanner 圖表查詢效能的最佳做法,包括下列最佳化方式:
- 避免對節點和邊緣的輸入表格進行完整掃描。
- 減少查詢從儲存空間讀取的資料量。
- 縮減中繼資料的大小。
從基數較低的節點開始
請編寫路徑遍歷,讓它從卡鼎節點開始。這種做法可讓中間結果集保持小巧,並加快查詢執行速度。
舉例來說,以下查詢的語意相同:
前向邊緣檢視:
GRAPH FinGraph MATCH (p:Person {name:"Alex"})-[:Owns]->(a:Account {is_blocked: true}) RETURN p.id AS person_id, a.id AS account_id;
反向邊緣檢查:
GRAPH FinGraph MATCH (a:Account {is_blocked:true})<-[:Owns]-(p:Person {name: "Alex"}) RETURN p.id AS person_id, a.id AS account_id;
假設使用者名稱為 Alex
的使用者人數少於遭封鎖的帳戶人數,建議您在前向邊緣遍歷中編寫這項查詢。
對於變長路徑穿越而言,從基數較低的節點開始特別重要。以下範例說明如何找出特定帳戶的三筆轉帳交易。
GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;
預設指定所有標籤
如果省略標籤,Spanner Graph 會推斷符合條件的節點和邊緣標籤。建議您盡可能為所有節點和邊指定標籤,因為這類推論不一定可行,且可能會導致掃描的標籤比實際需要的多。
單一 MATCH 陳述式
以下範例會找出與指定帳戶連結的帳戶,最多 3 次轉帳:
GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;
跨 MATCH 陳述式
當節點和邊參照相同元素,但跨越 MATCH
陳述式時,請指定節點和邊的標籤。
以下範例說明這個建議做法:
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;