연산자의 증분 새로 고침 방법

다음 테이블에는 각 연산자가 증분되는 방식(즉, 전체 결과 대신 변경 사항을 생성하는 새로운 쿼리 조각으로 변환되는 방식)과 성능 및 기타 고려해야 할 중요한 요소가 간략하게 설명되어 있습니다.

연산자

증분

고려 사항

SELECT <스칼라 식>

변경된 행에 식을 적용하여 증분됩니다.

특별히 고려할 점은 없고, 성능이 우수합니다.

WHERE <스칼라 식>

변경된 각 행에서 술어를 평가하고 술어가 true인 행만 포함하여 증분합니다.

일반적으로 성능이 우수합니다. 비용은 변경의 크기에 따라 선형적으로 증가합니다.

선택성이 높은 WHERE 식을 사용하여 동적 테이블을 새로 고치면 결과 동적 테이블이 변경되지 않더라도 웨어하우스 작동 시간이 필요할 수 있습니다. 이는 원본에서 어떤 변경 사항이 술어를 만족하는지 확인하기 위해 웨어하우스가 필요할 수 있기 때문입니다.

FROM <베이스 테이블>

마지막 새로 고침 이후 테이블에 추가되거나 제거된 마이크로 파티션을 스캔하여 증분합니다.

비용은 추가되거나 제거된 마이크로 파티션의 데이터 양에 따라 선형적으로 증가합니다.

권장 사항:

  • 새로 고침당 변경량을 원본 테이블의 약 5%로 제한합니다.

  • 많은 마이크로 파티션에 영향을 미치는 DMLs에 유의하십시오.

<쿼리> UNION ALL <쿼리>

양쪽의 모든 변경 사항에 대해 union-all을 수행하여 증분합니다.

특별히 고려할 점은 없고, 성능이 우수합니다.

WITH <CTE 목록> <쿼리>

각 공통 테이블 식의 변경 사항을 계산하여 증분합니다.

WITH를 사용하면 복잡한 쿼리를 더 쉽게 읽을 수 있지만, 단일 동적 테이블의 정의를 너무 복잡하게 만들지 않도록 유의합니다. 자세한 내용은 동적 테이블의 파이프라인 연결복잡한 동적 테이블에 대한 증분 새로 고침 모드 성능 최적화 섹션을 참조하십시오.

스칼라 집계

스칼라 집계는 현재 효율적으로 증분되지 않습니다. 입력 내용이 변경되면 완전히 다시 계산됩니다.

GROUP BY <키>

변경된 모든 그룹화 키에 대한 집계를 다시 계산하여 증분합니다.

원본 데이터가 그룹화 키로 클러스터링되어 있고 변경 사항이 그룹화 키의 작은 부분(대략 5% 미만)을 차지하는지 확인합니다.

그룹화 키에 기본 열이 아닌 복합 식이 포함되어 있는 경우 증분 새로 고침을 위해 대량의 데이터를 검사해야 할 수도 있습니다. 이러한 스캔의 크기를 줄이려면 하나의 동적 테이블에서 식을 구체화한 다음 다른 동적 테이블의 구체화된 열에 그룹화 작업을 적용합니다.

예를 들어, 다음의 복합 문을 살펴보겠습니다.

CREATE DYNAMIC TABLE sums
  AS
    SELECT date_trunc(minute, ts), sum(c1) FROM table
    GROUP BY 1;
Copy

위의 문은 다음과 같이 최적화될 수 있습니다.

CREATE DYNAMIC TABLE intermediate
  AS
    SELECT date_trunc(minute, ts) ts_min, c1 FROM table;
Copy
CREATE DYNAMIC TABLE sums
  AS
    SELECT ts_min, sum(c1) FROM intermediate
    GROUP BY 1;
Copy

DISTINCT

집계 함수가 없는 GROUP BY ALL과 동일합니다.

이는 종종 상당한 최적화 기회를 의미합니다.

실수로 중복이 발생하는 것을 방지하기 위해 쿼리 전체에 DISTINCT를 자유롭게 적용하는 것이 일반적인 관행입니다. 증분 새로 고침에서 DISTINCT 연산자는 새로 고칠 때마다 중복 여부를 확인해야 하므로 반복적으로 리소스를 소모합니다.

성능을 최적화할 때 중복된 DISTINCTs를 찾아 제거하는 것은 쉬울 수 있습니다. 이를 위해 업스트림에서 중복을 제거하고 조인 카디널리티를 신중하게 고려하면 됩니다.

<fn> OVER <윈도우>

변경된 모든 파티션 키에 대해 윈도우 함수를 다시 계산하여 증분합니다.

쿼리에 PARTITION BY 절이 있고 원본 데이터가 파티션 키별로 클러스터링되어 있는지 확인합니다. 또한 변경 사항이 파티션의 작은 부분(대략 5% 미만)을 차지하도록 합니다.

<왼쪽> INNER JOIN <오른쪽>

왼쪽의 변경 사항을 오른쪽에 결합한 다음 오른쪽의 변경 사항을 왼쪽에 결합하는 방식으로 증분합니다.

조인의 한 쪽이 작으면 성능이 우수할 가능성이 높습니다. 조인의 한 쪽이 자주 변경되는 경우 다른 쪽을 조인 키로 클러스터링하면 성능이 향상될 수 있습니다.

<왼쪽> [{LEFT | RIGHT | FULL }] OUTER JOIN <오른쪽>

일치하지 않는 경우 NULLs를 계산하기 위해 하나 또는 두 개의 NOT EXISTS로 union-all이 수행된 내부 조인을 팩터링하여 증분합니다. 그런 다음 이 팩터링된 쿼리가 증분됩니다.

내부 조인은 그림과 같이 증분됩니다. 존재하지 않는 키는 한쪽의 변경된 키가 다른 쪽에 이미 존재하는지 확인하여 증분합니다.

권장 사항:

  • 조인의 한 쪽이 자주 변경되는 경우 다른 쪽을 조인 키로 클러스터링하면 성능이 향상될 수 있습니다.

  • 자주 변경되는 테이블은 왼쪽에 배치합니다.

  • OUTER 반대쪽의 변경을 최소화합니다. 따라서 LEFT OUTER의 경우 오른쪽 변경을 최소화합니다.

  • FULL 조인의 경우 지역성이 매우 중요합니다.

LATERAL FLATTEN

변경된 행에 데이터 스큐 연산자를 적용하여 증분합니다.

일반적으로 성능이 우수합니다. 비용은 변경의 크기에 따라 선형적으로 증가합니다. FROM <기본 테이블> 연산자와 동일한 일반적인 고려 사항이 적용됩니다.