이 문서에서는 Spanner Graph 쿼리 성능 조정을 위한 권장사항에 대해 설명합니다. 여기에는 다음과 같은 최적화가 포함됩니다.
- 노드와 에지에 대한 입력 테이블의 전체 스캔 방지
- 쿼리가 스토리지에서 읽어야 하는 데이터 양 감소
- 중간 데이터 크기 감소
낮은 카디널리티 노드에서 시작
낮은 카디널리티 노드에서 시작하도록 경로 순회를 작성합니다. 이 접근 방법은 중간 결과 집합을 작게 유지하고 쿼리 실행 속도를 높여줍니다.
예를 들어 다음 쿼리는 동일한 시맨틱스를 포함합니다.
정방향 에지 순회:
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;
역방향 에지 순회:
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;
이름이 Alex
인 사람의 수가 차단된 계정의 수보다 적다고 가정하면 이 쿼리를 정방향 에지 순회로 작성하는 것이 좋습니다.
가변 길이 경로 순회의 경우 특히 낮은 카디널리티 노드로 시작하는 것이 중요합니다. 다음 예시는 3개 홉 내에 지정된 계정으로부터 일시적으로 이전되는 계정을 찾는 권장방법을 보여줍니다.
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;