쿼리 최적화 도구

쿼리 최적화 도구는 무엇인가요?

Cloud Spanner SQL 쿼리 최적화 도구는 쿼리에 필요한 데이터가 무엇인지 기술하는 선언적인 SQL 문을 해당 데이터를 정확하게 가져오기 위한 한 가지 방법을 기술하는 명령적인 실행 계획으로 변환합니다. 선언적인 문을 쿼리 실행 계획으로 변환하는 과정에는 쿼리 표현을 위해 사용되는 3개의 구조체로 변환을 수행하는 작업이 포함됩니다. 실행 계획을 생성하는 동안 최적화 도구는 올바른 행이 반환되도록 원래 SQL 쿼리의 논리적 의미를 보존합니다.

최적화 도구의 또 다른 중요한 역할은 효율적인 실행 계획을 생성하는 것입니다.

Cloud Spanner 최적화 도구가 효율적인 실행 계획을 생성하기 위해 어떻게 하나요?

Cloud Spanner의 최적화 도구는 잘 설정된 휴리스틱과 비용 기반의 최적화를 결합하여 효율적인 계획을 생성합니다. 일부 휴리스틱은 '데이터를 로컬 머신으로 가져오는 대신 원격 머신에서 필터 수행'과 같이 매우 직관적입니다. 다른 휴리스틱은 이보다 더 복잡하지만 여전히 데이터 볼륨을 줄여주는 논리를 해당 데이터에 더 가깝게 이동하는 원칙을 따릅니다. 이러한 원칙은 여러 머신 간에 데이터를 샤딩하는 시스템에서 특히 중요합니다.

이러한 고정된 규칙을 사용하여 모든 실행 결정을 효율적으로 내릴 수 있진 않기 때문에, Cloud Spanner의 최적화 도구는 대안의 예상 비용을 기준으로 의사결정을 수행합니다. 이러한 비용 예상 값은 쿼리 구조, 데이터베이스 스키마, 쿼리 조각으로 생성되는 데이터 볼륨의 예상 값을 사용해서 계산됩니다. 예를 들어 Cloud Spanner는 SongGenre = 'Country' 필터가 쿼리에 표시될 때 Songs 테이블에서 이 필터에 해당하는 행수가 얼마나 될지 예상합니다. 이러한 예상 값의 계산을 돕기 위해 Cloud Spanner는 주기적으로 사용자 데이터에 대한 통계를 수집합니다.

쿼리 실행 계획 및 분산 환경에서의 쿼리 수행을 위해 Cloud Spanner에서 쿼리 실행 계획이 사용되는 방법을 자세히 알아보려면 쿼리 실행 계획을 참조하세요.

쿼리 최적화 도구 버전 관리

시간이 지남에 따라 쿼리 최적화 도구도 발전하여 쿼리 실행 계획에서 선택 옵션의 범위가 확장되고 이러한 옵션을 알려주는 예상 값의 정확도가 향상되어, 더 효율적인 쿼리 실행 계획을 얻을 수 있습니다.

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

관리 효율 향상을 위해 쿼리에 사용되는 쿼리 최적화 도구 버전을 관리할 수 있는 기능이 도입되었습니다. 최신 버전으로 커밋하기 전 이전 버전과 최신 버전 사이의 쿼리 성능 프로필을 비교해볼 수 있습니다. 자세한 내용은 쿼리 최적화 도구 관리를 참조하세요.

쿼리 최적화 도구 버전 기록

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

버전 3: 2021년 8월 1일(최신 및 기본값)

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

    문 힌트: SQL @{join_method=merge_join} SELECT ...

    조인 힌트: SQL SELECT ... FROM (...) JOIN@{join_method=merge_join} (...)

  • JOIN METHOD 쿼리 힌트 값을 사용하여 사용 설정된 새 조인 알고리즘인 푸시 브로드캐스트 해시 조인을 추가합니다.

    조인 힌트: SQL SELECT ... FROM (...) JOIN@{join_method=push_broadcast_hash_join} (...)

  • 해당하는 경우 기본적으로 사용 설정되는 분산 병합 통합을 도입합니다.

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

    예:

    테이블을 참조하세요.

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

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

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

    예:

    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일

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

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

쿼리 최적화 도구 통계 패키지

Cloud Spanner는 테이블 열의 데이터 분포에 대한 통계를 유지하여 쿼리에서 생성할 행의 수를 추정할 수 있습니다. 쿼리 옵티마이저는 이러한 예측을 사용하여 가장 적합한 쿼리 실행 계획을 선택합니다. Cloud Spanner에서 이러한 통계를 주기적으로 업데이트합니다. 통계는 쿼리 실행 계획을 선택하는 데 사용되므로 통계가 업데이트되면 Cloud Spanner에서 쿼리에 사용하는 쿼리 계획을 변경할 수 있습니다.

기본적으로 데이터베이스는 생성된 최신 통계 패키지를 자동으로 사용합니다. 데이터베이스를 이전 통계 패키지 버전에 고정할 수 있습니다. 최신이 아닌 통계 패키지를 사용하여 개별 쿼리를 실행할 수도 있습니다.

통계 패키지의 가비지 컬렉션

Cloud Spanner는 3일 간격으로 통계 패키지를 업데이트합니다. 이전 패키지는 생성 후 30일 동안 보관된 후 가비지 컬렉션에 적용됩니다.

Cloud Spanner 기본 제공 INFORMATION_SCHEMA.SPANNER_STATISTICS 테이블에는 사용 가능한 통계 패키지 목록이 포함됩니다. 이 표의 각 행에는 통계 패키지가 이름별로 나열되고 이름에는 지정된 패키지의 생성 타임스탬프가 포함됩니다. 또한 각 항목에는 패키지가 가비지로 수집될 수 있는지 여부를 정의하는 ALLOW_GC라는 필드가 있습니다.

전체 데이터베이스를 해당 표에 나와 있는 패키지 중 하나에 고정할 수 있습니다. 데이터베이스가 이 패키지에 고정되어 있는 동안에는 고정된 통계 패키지가 가비지로 수집되지 않고 ALLOW_GC 값이 무시됩니다. 개별 쿼리에 특정 통계 패키지를 사용하려면 패키지가 ALLOW_GC=FALSE와 함께 나열되거나 고정되어야 합니다. 이렇게 하면 통계 패키지가 가비지로 수집된 후 쿼리 실패가 방지됩니다. ALTER STATISTICS DDL 문을 사용하여 ALLOW_GC 값을 변경할 수 있습니다.

패키지 보관 및 PII

통계 패키지에는 표준 업계 관행에 따라 열 데이터의 히스토그램이 포함됩니다. 이를 통해 쿼리 옵티마이저에서 최적의 쿼리 계획을 선택할 수 있습니다. 히스토그램은 작은 값 샘플을 통해 구성됩니다. 이 작은 데이터 세트에 PII가 포함될 수 있습니다.

Cloud Spanner는 새 통계 패키지를 정기적으로 만들고 기본적으로 30일 동안 보관합니다. 따라서 데이터베이스에서 삭제된 값의 작은 샘플은 통계 히스토그램에서 30일 동안 추가 보관될 수 있습니다. optimizer_statistics_package 데이터베이스 옵션으로 고정된 통계 패키지나 ALLOW_GC=FALSE 옵션이 포함된 패키지는 가비지로 수집되지 않습니다. 이 패키지의 히스토그램에는 데이터베이스에서 삭제된 값이 더 오래 포함될 수 있습니다. 또한 통계 패키지의 콘텐츠는 데이터베이스 백업에 포함됩니다.

최적화 도구 통계는 사용자 데이터와 동일한 방식으로 암호화되어 저장됩니다.

이러한 패키지에 필요한 총 스토리지 양은 일반적으로 100MB 미만이며 총 스토리지 비용에 포함됩니다.

다음 단계