새로 고침 모드가 동적 테이블 성능에 미치는 영향

동적 테이블의 실제 새로 고침 모드 는 생성 시점에 결정되며 이후에는 변경할 수 없습니다. 명시적으로 지정하지 않으면 새로 고침 모드는 쿼리 복잡성, 지원되지 않는 구조체, 연산자 또는 함수 등 다양한 요소에 따라 새로 고침 모드를 선택하는 AUTO 가 기본값으로 설정됩니다.

동적 테이블의 새로 고침 모드를 확인하려면 동적 테이블 새로 고침 모드 보기 섹션을 참조하십시오.

사용 사례에 가장 적합한 모드를 결정하려면 자동 권장 사항과 구체적인 새로 고침 모드(전체 및 증분)를 실험해 보십시오. 동적 테이블 성능에 가장 적합한 모드는 데이터 변경량과 쿼리 복잡성에 따라 달라집니다. 또한 전용 웨어하우스에서 다양한 새로 고침 모드를 테스트하면 비용을 분리하고 실제 워크로드에 따라 성능 튜닝을 개선하는 데 도움이 됩니다.

Snowflake 릴리스 전반에서 일관적인 동작을 유지하려면 모든 프로덕션 테이블에서 새로 고침 모드를 명시적으로 설정해야 합니다. AUTO 의 동작은 Snowflake 릴리스 간에 변경될 수 있으며, 프로덕션 파이프라인에서 사용할 경우 예기치 않은 성능 변경이 발생할 수 있습니다.

자세한 내용은 성능 최적화를 위한 모범 사례 섹션을 참조하십시오.

전체 새로 고침 모드 성능

전체 새로 고침은 쿼리를 실행하고 동적 테이블을 결과로 덮어씁니다. 동적 테이블의 내용은 전체 새로 고침 모드나 증분 새로 고침 모드 중 어느 것을 선택했는지에 관계없이 동일합니다.

전체 새로 고침은 일반적으로 증분 새로 고침이 덜 효율적인 복잡한 쿼리나 워크로드에 사용됩니다.

전체 새로 고침은 리소스를 많이 사용하지만, 지원되지 않는 증분 작업 또는 중요한 데이터 변경 등 전체 데이터 세트를 재처리해야 할 때 유용합니다.

전체 새로 고침 성능을 최적화하려면 다른 Snowflake 쿼리와 동일하게 처리하되, 비용에는 쿼리 실행뿐만 아니라 쿼리 실행과 결과 삽입이 모두 포함됩니다.

증분 새로 고침 모드 성능

증분식 새로 고침은 마지막 새로 고침 이후의 변경 사항을 적용하는 데 중점을 두므로 소규모 업데이트가 포함된 대규모 데이터 세트에 더 효율적입니다. 동적 테이블의 내용은 선택한 새로 고침 모드에 관계없이 동일합니다.

그러나 증분적 새로 고침은 변경되지 않은 데이터를 다시 처리하지 않으므로 리소스 효율성이 더 높을 수 있습니다. 증분식 새로 고침을 사용할지 여부는 워크로드의 특성(변경 사항의 양과 복잡성, 속도 및 리소스 절약 측면에서의 잠재적인 성능 향상 등)에 따라 달라집니다.

다음 섹션에서는 증분 새로 고침에 적합한 워크로드를 구성하는 요소에 대해 설명합니다. 워크로드가 이 섹션에 설명된 조건에 적합하지 않는 경우, 효율성을 높이기 위해 전체 새로 고침 모드를 사용해 보십시오.

증분 새로 고침 성능 최적화에 대한 자세한 내용은 증분 새로 고침 성능 섹션을 참조하십시오.

참고

이 설명서에 나와 있는 권장 사항은 시간이 지남에 따라 증분 새로 고침 쿼리에 대한 지원이 향상되고 성능이 개선됨에 따라 변경될 수 있습니다.

증분 새로 고침 성능 이해하기

증분 새로 고침에서는 일반적으로 동적 테이블의 변경 사항을 계산하는 데 대부분의 작업이 수행됩니다. 이는 쿼리에 따라 달라지며 매우 복잡할 수 있습니다. 증분 새로 고침은 원본 테이블 자체는 스캔하지 않고 원본 테이블의 변경 사항만 스캔한다는 오해가 많습니다. 이로 인해 증분 새로 고침은 변경된 원본 데이터의 양에 비례해서만 작업을 수행해야 한다는 오해가 생길 수 있는데, 이는 사실이 아닙니다. 실제로 증분 새로 고침에서는 종종 원본 테이블을 직접 스캔해야 합니다.

예를 들어, 테이블 A와 B 사이에 내부 조인을 수행하는 쿼리를 상상해 보십시오. 행이 테이블 A에 삽입되면 쿼리의 변경 사항을 계산하기 위해 테이블 B와 조인해야 합니다. A의 단일 행을 B의 여러 행과 결합할 수 있는데, 이는 소스에 약간의 변경 사항만이 있더라도 많은 작업이 필요하다는 것을 의미합니다.

이러한 추가 작업은 다양한 연산자에게서 발생할 수 있습니다. 증분 새로 고침은 새로운 데이터를 처리하고 이미 완료된 작업을 건너뜁니다. 특히 복잡한 쿼리의 경우 건너뛸 항목을 결정하는 데 추가 작업이 필요할 수 있으며, 작업자마다 다른 방식으로 작업을 건너뛸 수 있습니다.

일반적으로 변경 사항의 크기와 지역성에 따라 건너뛸 수 있는 작업의 양이 달라집니다.

크기가 증분 새로 고침 성능에 미치는 영향

증분 새로 고침 성능에 영향을 미치는 가장 중요한 요소는 원본 데이터의 변경 크기입니다. 동적 테이블 새로 고침에 대한 변경 크기를 결정할 때 복사된 행도 계산에 포함해야 합니다. 마이크로 파티션의 일부 행을 변경하는 DML은 해당 마이크로 파티션의 변경되지 않은 행도 새 마이크로 파티션으로 복사합니다.

변경된 행의 수를 분석하려면 기본 테이블에서 마지막 새로 고침 시점의 기본 테이블에 스트림을 생성 하고 SYSTEM$STREAM_BACKLOG 를 사용합니다. 예:

CREATE STREAM mystream ON TABLE mybasetable BEFORE(STATEMENT => 'last refresh UUID');
Copy
SELECT * FROM SYSTEM$STREAM_BACKLOG('mystream');
Copy

극단적인 예로, 소스에서 모든 데이터를 삭제하는 효과를 생각해 보십시오. 전체 새로 고침을 하면 빈 테이블만 표시되므로 매우 빠르게 처리할 수 있습니다. 반면, 증분 새로 고침은 삭제된 행을 모두 처리해야 하므로 훨씬 느립니다.

덜 극단적인 경우에도 유사한 속도 저하가 발생할 수 있습니다. 워크로드를 줄이기 위한 좋은 지침은 원본 또는 대상의 변경 사항을 행의 5% 미만으로 유지하는 것입니다.

지역성이 증분 새로 고침 성능에 미치는 영향

증분 새로 고침에 영향을 미치는 두 번째로 중요한 요소는 지역성 으로, 이는 데이터 또는 작업이 서로 다른 차원에서 얼마나 밀접하게 관련되어 있는지를 나타냅니다.

예를 들어, 타임스탬프 열이 있는 테이블이 있고 해당 열에 항상 현재 시간이 있는 행을 삽입하는 경우, 워크로드는 삽입 순서와 타임스탬프 열 사이에 강한 지역성을 갖습니다.

지역성은 다양한 형태로 나타날 수 있지만, 특히 증분 새로 고침에 중요한 몇 가지가 있습니다. 다음 영역 중 하나라도 지역성을 개선하면 점진적 새로 고침의 성능이 향상되지만, 세 가지 카테고리 모두에서 강력한 지역성을 갖는 것이 항상 가능한 것은 아닙니다.

지역성 영역

설명

클러스터링과 분할 키 사이의 지역성.

동적 테이블 정의에서 분할 작업을 수행할 때 이러한 분할 키를 기준으로 기본 소스가 클러스터링되는 것이 좋습니다.

예를 들어, ID를 사용하여 두 테이블을 조인하는 경우 각각의 ID 열을 기준으로 테이블을 클러스터링하는 것이 증분 새로 고침 성능에 더 좋습니다.

분할 또는 그룹화 키와 소스 변경 간의 지역성.

이상적으로는 원본에 대한 변경 사항은 원본 테이블의 일부 행에만 공통으로 파티셔닝 키를 가져야 합니다.

예를 들어, 현재 타임스탬프가 있는 행을 삽입하는 경우 키와 소스 변경 사항 간의 강력한 지역성으로 인해 시간별로 그룹화하는 것이 효과적입니다. 그러나 ㅌ테이블의 다른 여러 행에 나타나는 열 값이 있는 행을 삽입하는 경우 해당 열을 기준으로 그룹화하면 증분 새로 고침 성능이 저하됩니다.

대상 테이블 변경과 클러스터링 간의 지역성.

증분 새로 고침이 동적 테이블에 변경 사항을 적용하면 업데이트와 삭제가 동적 테이블의 현재 상태에 결합됩니다. 이 조인은 변경 사항이 동적 테이블의 클러스터링과 일치하는 경우 더 나은 성능을 발휘합니다.

예를 들어, 새로 고침이 최근에 삽입된 행만 업데이트하는 경우 테이블의 클러스터링과 잘 일치합니다.

Snowflake 테이블이 저장되는 방법에 대한 내용은 Snowflake 테이블 구조 이해하기 섹션을 참조하십시오. 테이블에서 클러스터링을 관리하려면 자동 클러스터링 을 사용합니다.

개별 연산자의 증분 새로 고침에 대한 성능 기대치

다음 테이블은 개별 연산자의 증분 새로 고침에 대한 대략적인 성능 기대치를 보여줍니다. 성능은 행의 5%만 변경되고 새로 고침 작업이 1분 이상 걸린다는 가정 하에 전체 새로 고침을 기준으로 측정됩니다.

참고

쿼리 최적화로 속도가 빨라지지 않는 고정 오버헤드(예: 쿼리 최적화, 웨어하우스 스케줄링, 작업 정리)로 인해 10초 미만의 짧은 쿼리의 경우 성능 향상 효과가 더 작을 수 있습니다.

연산자

성능 향상

SELECT

10배

WHERE

10배

FROM

10배

UNION ALL

10배

스칼라 집계

10배

지역성의 영향을 받는 연산자의 경우, 이 테이블에는 지역성이 좋은 경우와 좋지 않은 경우의 예상 성능이 표시됩니다. 일부 연산자의 경우 지역성이 좋지 않으면 전체 새로 고침보다 성능이 저하될 수 있습니다.

연산자

지역성

성능 향상

GROUP BY

우수

5배

GROUP BY

불량

1/3배

DISTINCT

우수

5배

DISTINCT

불량

1/4배

OVER

우수

2~5배

OVER

불량

1/5배

INNER JOIN

우수

10배

INNER JOIN

불량

2배

OUTER JOIN

우수

3배

OUTER JOIN

불량

0.1배

자세한 내용은 연산자의 증분 새로 고침 방법 섹션을 참조하십시오.

복잡한 동적 테이블에 대한 증분 새로 고침 모드 성능 최적화

일반적으로 동적 테이블에는 여러 연산자가 포함되어 있어 증분 새로 고침으로 인해 성능을 예측하기가 어렵습니다. 이 섹션에서는 이런 문제를 처리하는 방법을 살펴보고 복잡한 동적 테이블의 성능을 향상하기 위한 몇 가지 팁을 제공합니다.

여러 연산자가 관련된 경우 증분 새로 고침은 각 연산자에 대해 개별적으로 작업하여 변경 사항을 계산하고, 입력에 따라 변경 사항을 계산할 수 있는 쿼리 계획의 조각으로 전환합니다. 각 입력에 대해 이 증분 새로 고침은 변경 전, 변경 후 또는 변경 자체에 대한 입력을 요청할 수 있습니다. 원래 쿼리의 모든 연산자에 이 프로세스를 적용하면 변경 스캔과 전체 테이블 스캔을 혼합하여 변경 사항을 계산하는 새로운 쿼리 계획을 얻을 수 있습니다. 이 계획은 Snowflake의 쿼리 최적화 프로그램에 의해 최적화되고 다른 쿼리와 마찬가지로 실행됩니다.

증분 새로 고침의 성능이 좋지 않은 경우는 일반적으로 변경 사항이 너무 많거나 지역성이 좋지 않기 때문입니다. 복잡한 쿼리로 인해 이러한 문제를 파악하는 것이 더욱 어려워집니다. 증분 연산자의 성능은 일반적으로 변경의 양과 입력의 지역성에 따라 달라집니다. 그러나 이러한 입력은 다른 연산자의 출력이므로 연산자를 이동하면서 데이터의 양과 지역성이 달라질 수 있습니다.

따라서 복잡한 증분 새로 고침의 성능을 이해하려면 각 연산자의 입력을 별도로 고려해야 합니다. 다음은 몇 가지 일반적인 시나리오와 이를 해결하기 위한 제안 사항입니다.

시나리오

권장 사항

여러 열에 걸쳐 테이블을 조인하고 있으므로 모든 열에 동시에 CLUSTER BY를 사용할 수 없습니다.

자주 변경되는 키별로 큰 테이블을 우선적으로 클러스터링합니다. 예를 들어, 큰 차원 테이블이 있는 스타 스키마에서는 차원 테이블을 클러스터링하는 데 중점을 둡니다.

동일한 데이터 세트의 여러 복사본을 만들고, 각각을 다른 키로 클러스터링하고, 관련 컨텍스트에서 사용하는 것이 좋습니다.

여러 조인에 GROUP BY 또는 OVER가 있습니다.

원본 테이블이 그룹화/파티션 키로 클러스터링되었는지 확인하고, 조인과 집계를 두 개의 별도 동적 테이블로 분할하는 것이 좋습니다.

외부 조인은 집계와 원활하게 상호 작용되지 않는다는 점에 유의하십시오.