이 문서에서는 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;