Spanner Graph 쿼리 조정 권장사항

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

다음 단계