동적 테이블 성능 최적화

이 항목에서는 동적 테이블 성능 최적화 기법을 설계 변경 및 조정 섹션으로 나누어 살펴봅니다.

동적 테이블을 최적화하기 전에 새로 고침이 느린 원인을 진단하는 것이 좋습니다. 단계별 워크플로는 느린 새로 고침 원인 진단 섹션을 참조하세요.

성능 카테고리에 대한 배경 정보는 성능 결정 사항 섹션을 참조하세요.

설계 변경

설계를 변경하려면 동적 테이블을 다시 만들어야 하지만, 성능 면에서는 더 큰 효과를 얻을 수 있습니다.

참고

하나씩 수정하기보다는 변경 사항을 그룹화하고 테이블을 한꺼번에 다시 생성하는 것이 좋습니다.

새로 고침 모드 선택

선택한 새로 고침 모드는 새로 고침을 할 때마다 Snowflake가 처리하는 데이터의 양을 결정하므로, 성능에 상당한 영향을 미칩니다. 각 모드의 작동 방식에 대한 자세한 내용은 동적 테이블 새로 고침 모드 섹션을 참조하세요.

중요

증분 새로 고침을 사용하는 동적 테이블은 전체 새로 고침을 사용하는 동적 테이블의 다운스트림에 있을 수 없습니다.

다음과 같은 결정 프로세스를 사용하여 새로 고침 모드를 선택합니다.

  1. 쿼리를 지원되는 쿼리 구문 목록과 대조하여 검토합니다. 모든 쿼리 연산자가 증분 새로 고침을 지원하는 것은 아닙니다. 지원되는 연산자에 대해서는 증분 새로 고침을 위한 쿼리 최적화 섹션을 참조하여 해당 연산자가 성능에 미치는 영향을 이해하세요.

  2. 새로 고침 사이에 변경되는 데이터의 백분율인 변경 볼륨을 추정합니다. 예를 들어, 증분 새로 고침은 데이터가 5% 미만으로 변경될 때 가장 효과적입니다.

  3. 데이터 지역성을 평가합니다. 소스 테이블이 동적 테이블 쿼리에서 Join, GROUP BY 또는 PARTITION BY 절에 사용할 키를 기준으로 클러스터링되어 있는지 확인합니다. 지역성이 양호하지 않으면 증분 새로 고침 효율성이 감소합니다. 지역성을 개선하려면 데이터 지역성 개선 섹션을 참조하세요.

  4. 다음 테이블에 따라 모드를 선택합니다.

    모드

    사용 시점

    증분

    쿼리가 지원되는 연산자를 사용하고 새로 고침 사이의 데이터 변경 사항이 5% 미만이며 소스 테이블의 데이터 지역성이 양호합니다.

    참고

    증분 새로 고침은 변경된 행뿐만 아니라 소스 테이블도 계속 스캔할 수 있습니다. 예를 들어, 조인의 한 쪽에 새 행이 있으면 다른 테이블의 모든 행과 대조하여 일치하는지 확인해야 합니다. 적은 수의 변경으로도 상당한 작업이 수행될 수 있습니다.

    전체

    많은 비율의 데이터가 변경되거나, 쿼리가 지원되지 않는 연산자를 사용하거나, 데이터의 지역성이 부족합니다.

    자동

    프로토타이핑 또는 테스트 중입니다. Snowflake 릴리스 간에 동작이 변경될 수 있으므로 프로덕션에서는 AUTO를 사용하지 마세요.

  5. 동적 테이블을 생성할 때 CREATE DYNAMIC TABLE 문에서 REFRESH_MODE = INCREMENTAL 또는 ``REFRESH_MODE = FULL``로 모드를 지정합니다.

동적 테이블이 사용하는 새로 고침 모드를 확인하려면 새로 고침 모드 섹션을 참조하세요.

쿼리 및 파이프라인 최적화

동적 테이블 쿼리 및 파이프라인의 구조는 새로 고침 성능에 직접적인 영향을 미칩니다. 다음 지침을 참조하여 새로 고칠 때마다 작업을 줄입니다.

개별 쿼리 간소화

  • 외부 조인 대신 내부 조인을 사용합니다. 내부 조인은 증분 새로 고침을 사용하면 성능이 향상됩니다. 외부 조인을 방지할 수 있도록 소스 데이터의 참조 무결성을 확인합니다.

  • 불필요한 작업을 피합니다. 중복 DISTINCT 절 및 사용되지 않는 열을 제거합니다. 자주 쿼리되지 않는 넓은 열을 제외합니다(예: 큰 JSON blob).

  • 중복을 효율적으로 제거합니다. 가능한 경우 DISTINCT 대신 순위 지정 함수를 사용합니다.

특정 SQL 연산자가 증분 새로 고침 성능에 미치는 영향에 대한 자세한 지침은 증분 새로 고침을 위한 쿼리 최적화 섹션을 참조하세요.

참고

포괄적인 예제는 자습서 SCD 유형 1 워크로드를 위한 동적 테이블 성능 최적화 섹션을 참조하세요.

여러 동적 테이블에 걸쳐 변환 분할

복잡한 변환을 여러 동적 테이블로 나누면 병목 현상을 더 쉽게 식별하고 디버깅을 개선할 수 있습니다. :ref:`불변성 제약 조건 <label-dt-optimize-immutability>`을 통해 스테이지마다 다른 새로 고침 모드를 사용할 수도 있습니다.

  • 필터를 조기에 추가합니다. 다운스트림 테이블이 더 적은 행을 처리하도록 소스 데이터에 가장 가까운 동적 테이블에 WHERE 절을 적용합니다.

  • 다운스트림 테이블에서 DISTINCT 작업이 반복되는 것을 방지하려면 파이프라인에서 조기에 중복 행을 제거합니다.

  • 테이블당 작업 수를 줄입니다. 조인, 집계 또는 윈도우 함수를 하나의 쿼리로 모두 결합하는 대신 중간 동적 테이블로 이동합니다.

  • 복합 식(예: DATE_TRUNC('minute', ts))을 사용해 그룹화하기 전에 중간 테이블에서 구체화합니다. 자세한 내용은 집계 최적화 섹션을 참조하십시오.

참고

최적의 분할점을 찾으려면 시행착오가 필요합니다.

GROUP BY, DISTINCT, ``PARTITION BY``가 포함된 윈도우 함수, 조인과 같이 서로 다른 키로 데이터를 셔플링하는 연산 간에 분할하는 것이 좋습니다. 이를 통해 각 동적 테이블은 핵심 연산에 대해 더 나은 데이터 지역성을 유지할 수 있습니다. 연산자별 지침은 증분 새로 고침을 위한 쿼리 최적화 섹션을 참조하세요.

다음 예제에서는 복잡한 쿼리를 중간 동적 테이블로 분할하는 방법을 보여줍니다.

초기 복잡 쿼리:

CREATE DYNAMIC TABLE final_result
  TARGET_LAG = '1 hour'
  WAREHOUSE = my_warehouse
AS
  SELECT ...
  FROM large_table a
  JOIN dimension_table b ON ...
  JOIN another_table c ON ...
  GROUP BY ...;
Copy

중간 동적 테이블을 추가하여 복잡한 파이프라인을 분할합니다.

CREATE DYNAMIC TABLE intermediate_joined
  TARGET_LAG = DOWNSTREAM
  WAREHOUSE = my_warehouse
AS
  SELECT ...
  FROM large_table a
  JOIN dimension_table b ON ...;

CREATE DYNAMIC TABLE final_result
  TARGET_LAG = '1 hour'
  WAREHOUSE = my_warehouse
AS
  SELECT ...
  FROM intermediate_joined
  JOIN another_table c ON ...
  GROUP BY ...;
Copy

연산자가 성능에 미치는 영향에 대한 자세한 정보와 예제는 증분 새로 고침을 위한 쿼리 최적화 섹션을 참조하세요.

과거 데이터를 변경할 수 없는 데이터로 표시

IMMUTABLE WHERE 절을 사용하여 특정 행이 변경되지 않음을 Snowflake에 알립니다. 그러면 새로 고칠 때마다 작업 범위가 줄어듭니다.

구문, 예제 및 자세한 지침은 불변성 제약 조건 사용 섹션을 참조하세요.

조정

조정을 위해 동적 테이블을 다시 만들 필요는 없습니다. 파이프라인이 실행되는 동안 조정할 수 있습니다.

웨어하우스 구성 조정

CREATE DYNAMIC TABLE 문에서 지정하는 웨어하우스는 해당 테이블에 대한 모든 새로 고침을 실행합니다. 웨어하우스 크기와 구성은 새로 고침 기간과 비용에 직접적인 영향을 미칩니다.

웨어하우스 및 동적 테이블에 대한 자세한 내용은 동적 테이블의 웨어하우스 사용량 이해하기 섹션을 참조하세요. 일반적인 웨어하우스 성능 최적화 전략은 성능을 위한 웨어하우스 최적화하기 섹션을 참조하세요.

초기화를 위해 별도의 웨어하우스 사용

초기 새로 고침은 증분 새로 고침보다 훨씬 더 많은 데이터를 처리하는 경우가 많습니다. INITIALIZATION_WAREHOUSE를 사용하여 더 큰 웨어하우스에서 초기화를 실행합니다. 정기적인 새로 고침을 위해 더 작고 비용 효율적인 웨어하우스를 예약합니다.

CREATE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = 'DOWNSTREAM'
  WAREHOUSE = 'XS_WAREHOUSE'
  INITIALIZATION_WAREHOUSE = '4XL_WAREHOUSE'
  AS <query>;
Copy

기존 동적 테이블의 초기화 웨어하우스를 추가하거나 변경하려면 다음을 수행합니다.

ALTER DYNAMIC TABLE my_dynamic_table SET INITIALIZATION_WAREHOUSE = '4XL_WAREHOUSE';
Copy

초기화 웨어하우스를 제거하고 모든 새로 고침에 기본 웨어하우스를 사용하려면 다음을 수행합니다.

ALTER DYNAMIC TABLE my_dynamic_table UNSET INITIALIZATION_WAREHOUSE;
Copy

웨어하우스 구성을 보려면 SHOW DYNAMIC TABLES 를 사용하거나 DYNAMIC_TABLE_REFRESH_HISTORY 테이블 함수를 확인합니다.

필요할 때 크기 조정

비용과 성능의 균형을 맞추려면 바이트 유출을 방지하면서도 워크로드가 병렬로 사용할 수 있는 양을 초과하지 않는 웨어하우스 크기를 선택합니다. 더 빠른 새로 고침이 중요한 경우 비용 최적 지점을 약간 초과하여 크기를 늘립니다.

동적 테이블 새로 고침에 대한 고려 사항:

  • 유출된 바이트: 쿼리 기록에 로컬 또는 원격 저장소로 유출된 바이트가 표시되면 새로 고침 중에 웨어하우스의 메모리가 부족해진 것입니다. 웨어하우스가 클수록 유출을 방지하기 위해 더 많은 메모리를 제공합니다. 자세한 내용은 너무 커서 메모리에 적합하지 않은 쿼리 섹션을 참조하십시오.

  • 느린 초기 새로 고침: 초기 새로 고침이 느릴 때는 초기 생성 시 INITIALIZATION_WAREHOUSE를 설정하거나 웨어하우스의 크기를 일시적으로 조정한 다음 테이블이 생성된 후 크기를 줄입니다.

  • 포화 병렬 처리: 특정 시점 이후에는 병렬 처리를 추가해도 효과가 감소합니다. 웨어하우스 크기를 두 배로 늘리면 런타임을 절반으로 줄이지 않고도 비용이 두 배로 증가할 수 있습니다. 새로 고침이 병렬 처리를 사용하는 방식을 확인하려면 :ref:`쿼리 프로필 <label-dt-performance-monitor-query-profile>`을 검토합니다.

웨어하우스의 크기를 조정하려면 웨어하우스 크기 늘리기 섹션을 참조하세요.

비용 고려 사항은 가상 웨어하우스 크레딧 사용웨어하우스 관련 작업하기 섹션을 참조하세요.

멀티 클러스터 웨어하우스로 동시 새로 고침 처리

여러 동적 테이블이 웨어하우스를 공유하고 큐를 자주 새로 고치는 경우 :doc:`멀티 클러스터 웨어하우스 </user-guide/warehouses-multicluster>`를 사용하는 것이 좋습니다. 멀티 클러스터 웨어하우스는 쿼리가 큐에 추가될 때 클러스터를 자동으로 추가하고 수요가 감소하면 클러스터를 제거합니다. 이를 통해 사용량이 적은 기간 동안 사용하지 않은 용량에 대한 요금을 지불하지 않고도 피크 기간 동안 새로 고침 대기 시간을 개선할 수 있습니다.

큐 식별 및 줄이기에 대한 지침은 큐 줄이기 섹션을 참조하세요.

멀티 클러스터 웨어하우스에는 Enterprise Edition 이상이 필요합니다. 비용 고려 사항은 멀티 클러스터 웨어하우스에 대한 크기 조정 정책 설정하기 섹션을 참조하세요.

적합한 목표 지연 시간 식별

목표 지연 시간에 따라 동적 테이블을 새로 고치는 빈도를 제어할 수 있습니다. 목표 지연 시간이 짧다는 것은 데이터가 최신 상태지만 새로 고침이 더 자주 발생하고 컴퓨팅 비용이 증가한다는 의미입니다. 목표 지연 시간의 작동 방식에 대한 자세한 내용은 동적 테이블 목표 지연 이해하기 섹션을 참조하세요.

다음 권장 사항을 통해 워크로드의 목표 지연 시간을 최적화합니다.

  • 독립적인 최신성 보장이 필요하지 않은 중간 테이블의 경우 DOWNSTREAM을 사용합니다. 이러한 테이블은 다운스트림 테이블에 필요할 때만 새로 고칩니다.

  • 새로 고침 기록을 확인하여 적합한 지연 시간을 찾습니다. DYNAMIC_TABLE_REFRESH_HISTORY 또는 Snowsight 를 통해 새로 고침 기간 및 건너뛴 새로 고침을 분석합니다. 목표 지연 시간을 일반적인 새로 고침 기간보다 약간 높게 설정합니다.

목표 지연 시간 변경

ALTER DYNAMIC TABLE my_dynamic_table SET TARGET_LAG = '1 hour';
Copy

다운스트림 수요에 따라 새로 고치도록 동적 테이블을 설정하려면 다음을 수행합니다.

ALTER DYNAMIC TABLE my_dynamic_table SET TARGET_LAG = DOWNSTREAM;
Copy

데이터 지역성 개선

*지역성*은 Snowflake가 동일한 키 값을 공유하는 행을 얼마나 밀접하게 저장하고 있는지를 나타냅니다. 일치하는 키가 있는 행이 더 적은 수의 마이크로 파티션에 걸쳐 있는 경우(지역성이 양호함), 증분 새로 고침은 더 적은 데이터를 스캔합니다. 일치하는 키가 많은 마이크로 파티션에 걸쳐 있는 경우(지역성이 양호하지 않음), 증분 새로 고침이 전체 새로 고침보다 시간이 더 오래 걸릴 수 있습니다.

Snowflake가 데이터를 저장하는 방법에 대한 자세한 내용은 마이크로 파티션 및 데이터 클러스터링 섹션을 참조하세요.

클러스터 소스 테이블

지역성을 개선하는 가장 효과적인 방법은 동적 테이블 쿼리에 사용되는 키(JOIN, GROUP, BY 또는 PARTITION, BY 키)로 소스 테이블을 클러스터링하는 것입니다.

ALTER TABLE my_source_table CLUSTER BY (join_key_column);
Copy

여러 열을 기준으로 조인을 수행하지만 모든 열을 기준으로 클러스터링할 수 없는 경우 다음을 수행합니다.

  • 가장 선택적인 키로 더 큰 테이블을 클러스터링하는 우선 순위를 지정합니다.

  • 다른 동적 테이블에서 사용하기 위해 다른 키로 클러스터링된 동일한 데이터의 별도 복사본을 만드는 것이 좋습니다.

자세한 내용은 클러스터링 키 및 클러스터링된 테이블 섹션을 참조하십시오. 자동 재클러스터링을 활성화하려면 자동 클러스터링 섹션을 참조하세요.

지역성에 영향을 미치는 요소

소스 테이블 클러스터링 외에도 두 가지 다른 요소가 지역성에 영향을 미칩니다. 이는 데이터 패턴에 따라 달라지며 직접 변경하기가 더 어렵습니다.

  • 새 데이터가 파티션 키에 맞춰 조정되는 방식: 새 행이 테이블의 작은 부분에만 영향을 미치는 경우 증분 새로 고침이 더 빨라집니다. 이는 쿼리 구조가 아닌 데이터 수집 패턴에 따라 다릅니다.

    예를 들어, 시간별로 그룹화된 시계열 데이터는 새 행이 최근 타임스탬프를 공유하므로 지역성이 양호합니다. 전체 테이블에 걸쳐 값이 분산된 열로 그룹화된 데이터의 지역성은 양호하지 않습니다.

  • 변경 사항이 동적 테이블 클러스터링에 맞춰 조정되는 방식: Snowflake는 동적 테이블에 업데이트 또는 삭제를 적용할 때 영향을 받는 행을 찾아야 합니다. 변경된 행이 서로 가깝게 저장되면 속도가 더 빨라집니다.

    예를 들어, 동적 테이블이 시간을 기준으로 자연스럽게 정렬되면 최근 행에 대한 업데이트가 잘 수행됩니다. 전체 테이블에 걸쳐 분산된 업데이트는 더 느립니다. 이 요인은 변경되는 행과 빈도를 포함한 워크로드 패턴에 따라 달라집니다.

이러한 요인으로 인해 지역성이 양호하지 않은 경우 데이터 모델 또는 수집 패턴을 업스트림으로 조정할 수 있는지 여부를 고려합니다.