Spanner 쿼리 최적화 도구 버전

이 페이지에서는 다양한 Spanner 쿼리 최적화 도구 버전을 설명하고 기록을 제공합니다. 현재 기본 버전은 7입니다. 쿼리 최적화 도구에 대한 자세한 내용은 쿼리 최적화 도구 정보를 참조하세요.

Spanner는 쿼리 최적화 도구 업데이트를 새로운 쿼리 최적화 도구 버전으로 출시합니다. 기본적으로 각 데이터베이스는 최신 버전이 출시된 후 30일 이내에 해당 버전의 최적화 도구를 사용하기 시작합니다.

GoogleSQL 언어 데이터베이스를 사용하는 경우 쿼리에서 사용하는 쿼리 최적화 도구 버전을 관리할 수 있습니다. 최신 버전으로 커밋하기 전에 이전 버전과 최신 버전 간의 쿼리 성능 프로필을 비교할 수 있습니다. 자세한 내용은 쿼리 최적화 도구 관리를 참조하세요.

쿼리 최적화 도구 버전 기록

다음은 각 출시 버전에서 쿼리 최적화 도구에 적용된 업데이트 내용을 요약해서 보여줍니다.

버전 7: 2024년 5월 22일(최신 및 기본값)

  • 색인 조합 계획에 대한 비용 기반 선택 지원이 추가되었습니다.

  • 모든 키 부분에 대해 검색 가능한 조건자가 없는 쿼리에 대해 스마트 검색 선택과 통계 기반의 스캔 계획에 대한 지원이 추가되었습니다.

  • 해시 조인에 대한 비용 기반 선택 지원이 추가되었습니다.

버전 6: 2023년 9월 11일

  • 전체 외부 조인을 통한 제한 푸시와 조건자 푸시가 개선되었습니다.

  • 카디널리티 추정 및 비용 모델이 개선되었습니다.

  • DML 쿼리에 대해 비용 기반 최적화를 사용 설정했습니다.

버전 5: 2022년 7월 15일

  • 색인 선택, 배포 관리, 정렬 배치, GROUP BY 선택에 대한 비용 모델이 개선되었습니다.

  • 해시와 적용 조인 중에서 선택하는 비용 기반 조인 알고리즘 선택 지원이 추가되었습니다. 병합 조인에서도 계속 쿼리 힌트를 사용해야 합니다.

  • 비용 기반 조인 가환성 지원이 추가되었습니다.

버전 4: 2022년 3월 1일

  • 보조 색인 선택이 개선되었습니다.

    • 인터리브 처리된 테이블 간의 조인에서 보조 색인 사용이 개선되었습니다.
    • 보조 색인 사용 범위가 개선되었습니다.
    • 최적화 도구 통계가 오래되었을 때 색인 선택이 개선되었습니다.
    • 최적화 도구 통계를 사용할 수 없거나 기본 테이블이 작다고 보고되더라도 선행 색인 열에 조건자가 있는 보조 색인을 사용합니다.
  • 단일 전달 해시 조인을 도입합니다(새 힌트 hash_join_execution을 사용하여 사용 설정).

    조인 힌트:

    GoogleSQL

    SELECT ...
    FROM (...)
    JOIN@{join_method=hash_join, hash_join_execution=one_pass} (...)
    

    PostgreSQL

    SELECT ...
    FROM (...)
    JOIN/*@ join_method=hash_join, hash_join_execution=one_pass */ (...)
    

    새 모드는 해시 조인의 빌드 측 입력이 큰 경우에 유용합니다. 쿼리 실행 프로필에서 다음 사항을 관찰하면 전달 해시 조인 하나의 성능이 향상됩니다.

    • 해시 조인 오른쪽 하위 요소 실행 횟수가 해시 조인 연산자 실행 횟수보다 큽니다.
    • 해시 조인 연산자 오른쪽 하위 요소에 대한 지연 시간도 높습니다.

    기본적으로(hash_join_execution=multi_pass) 해시 조인의 빌드 측 입력이 너무 커서 메모리에 맞지 않으면 빌드 측이 여러 배치로 분할되어 프로브 측을 여러 번 스캔할 수 있습니다. 새로운 모드(hash_join_execution=one_pass)를 사용하면 해시 조인이 빌드 측 입력이 메모리에 맞지 않을 경우 디스크로 보내고 항상 프로브 측을 한 번만 스캔합니다.

  • 탐색에 사용되는 키 수 선택이 개선되었습니다.

버전 3: 2021년 8월 1일

  • JOIN METHOD 쿼리 힌트 값을 사용하여 사용 설정된 새 조인 알고리즘인 병합 조인을 사용 설정합니다.

    문 힌트:

    GoogleSQL

    @{join_method=merge_join}
    SELECT ...
    

    PostgreSQL

    /*@ join_method=merge_join */
    SELECT ...
    

    조인 힌트:

    GoogleSQL

    SELECT ...
    FROM (...)
    JOIN@{join_method=merge_join} (...)
    

    PostgreSQL

    SELECT ...
    FROM (...)
    JOIN/*@ join_method=merge_join */ (...)
    
  • JOIN METHOD 쿼리 힌트 값을 사용하여 사용 설정된 새 조인 알고리즘인 푸시 브로드캐스트 해시 조인을 추가합니다.

    조인 힌트:

    GoogleSQL

    SELECT ...
    FROM (...)
    JOIN@{join_method=push_broadcast_hash_join} (...)
    

    PostgreSQL

    SELECT ...
    FROM (...)
    JOIN/*@ join_method=push_broadcast_hash_join} */ (...)
    
  • 해당하는 경우 기본적으로 사용 설정되는 분산 병합 통합 연산자를 도입합니다. 이 작업은 쿼리 성능을 향상시킵니다.

  • SELECT 목록에 MAX 또는 MIN 집계(또는 HAVING MAX/MAX)가 없으면 GROUP BY에서 스캔 성능이 약간 향상됩니다. 이 변경 전에는 쿼리에서 필요하지 않더라도 Spanner에서 그룹화되지 않은 추가 열을 로드했습니다.

    예를 들어 다음 테이블을 살펴보세요.

    GoogleSQL

    CREATE TABLE myTable(
      a INT64,
      b INT64,
      c INT64,
      d INT64)
    PRIMARY KEY (a, b, c);
    

    PostgreSQL

    CREATE TABLE myTable(
      a bigint,
      b bigint,
      c bigint,
      d bigint,
      PRIMARY KEY(a, b, c)
    );
    

    이 변경 전에는 쿼리에 필요하지 않은 경우에도 쿼리가 c열을 로드했습니다.

    SELECT a, b
    FROM myTable
    GROUP BY a, b
    
  • 조인에서 도입하는 교차 적용 연산자가 있고 쿼리에서 LIMIT를 사용하여 정렬된 결과를 요청하면 LIMIT를 통해 일부 쿼리 성능이 향상됩니다. 이러한 변경 후에는 최적화 도구에서 먼저 교차 적용의 입력 측에 제한과 함께 정렬을 적용합니다.

    예:

    GoogleSQL

    SELECT a2.*
    FROM Albums@{FORCE_INDEX=_BASE_TABLE} a1
    JOIN Albums@{FORCE_INDEX=_BASE_TABLE} a2 USING(SingerId)
    ORDER BY a1.AlbumId
    LIMIT 2;
    

    PostgreSQL

    SELECT a2.*
    FROM albums/*@ force_index=_base_table */ a1
    JOIN albums/*@ force_index=_base_table */ a2 USING(singerid)
    ORDER BY a1.albumid
    LIMIT 2;
    
  • JOIN을 통해 더 많은 계산을 푸시하여 쿼리 성능을 향상시킵니다.

    조인을 통한 서브 쿼리나 구조체 생성을 포함할 수 있는 더 많은 계산을 푸시합니다. 이렇게 하면 분산 방식으로 더 많은 계산 수행 및 푸시된 계산에 의존하는 더 많은 작업 푸시다운 등과 같은 몇 가지 방법으로 쿼리 성능을 향상시킬 수 있습니다. 예를 들어 쿼리에는 제한이 있으며 정렬 순서는 이러한 계산에 따라 달라지므로 조인을 통해 제한을 푸시할 수도 있습니다.

    예:

    SELECT
      t.ConcertDate,
      (
        SELECT COUNT(*) FROM UNNEST(t.TicketPrices) p WHERE p > 10
      ) AS expensive_tickets,
      u.VenueName
    FROM Concerts t
    JOIN Venues u ON t.VenueId = u.VenueId
    ORDER BY expensive_tickets
    LIMIT 2;
    

버전 2: 2020년 3월 1일

  • 색인 선택에서 최적화 기능을 추가합니다.
  • 특정 상황에서 REGEXP_CONTAINSLIKE 조건자의 성능을 향상시켜 줍니다.
  • 특정 상황의 GROUP BY에서 스캔 성능을 향상시켜 줍니다.

버전 1: 2019년 6월 18일

  • 서술어 푸시다운, 한도 푸시다운, 중복 조인, 중복 표현식 제거 등 많은 규칙 기반의 최적화가 포함되었습니다.

  • 사용자 데이터에 대해 통계를 사용하여 각 테이블에 액세스하기 위해 사용할 색인을 선택합니다.

다음 단계