Dynamic Tables Insights 살펴보기
Dynamic Tables Insights 살펴보기
Dynamic Tables Insights는 각 동적 테이블(dynamic table)의 선언형 SQL 정의와 갱신(refresh) 실행 지표를 선제적으로 분석해서 실질적으로 도움이 되는 성능 인사이트를 보여줘요. 복잡한 파이프라인을 일일이 감사(audit)할 필요 없이 Snowsight 인터페이스나 Snowflake CoCo를 통해 갱신 지연 시간과 컴퓨팅 비용을 키우는 구조적 병목을 찾아 해결할 수 있어요.
출처: Snowflake 문서
본문
Dynamic Tables Insights 동작 방식
Dynamic Tables Insights는 각 동적 테이블의 SQL 정의를 평가하고 시간이 지남에 따라 갱신 실행을 모니터링해요. 효율적인 증분(incremental) 처리를 막는 패턴이 감지되거나, 증분 유지보수 비용이 전체 갱신(full refresh)만큼 커지는 상황이 감지되면 해당 테이블에 대한 권장 사항을 생성해요.
Insights는 두 가지 범주의 문제를 보여줘요:
- 쿼리 구조(Query structure): 증분 갱신 최적화를 막는 SQL 패턴. 예를 들어 서브쿼리 안에 묻혀 있는 집계 함수나, 쿼리의 최외곽(outermost) 레벨에 있지 않은 중복 제거(deduplication) 절이 있어요.
- 갱신 실행 특성(Refresh execution characteristics): 개선 여지가 드러나는 런타임 조건. 예를 들어
INCREMENTAL대신ADAPTIVE갱신 모드를 쓰거나 웨어하우스 크기를 키우는 등이 있어요.
Snowsight에서 인사이트 찾고 해결하기
Snowsight Dynamic Tables 랜딩 페이지: Snowsight의 Dynamic Tables 목록 페이지에서 Insights 필터를 선택하면 내 계정 전체에서 활성 권장 사항이 있는 모든 동적 테이블을 볼 수 있어요.
개별 동적 테이블 인사이트: 특정 동적 테이블의 상세(detail) 또는 개요(overview) 페이지를 열어요. 인사이트가 있으면 갱신 그래프와 실행 지표 옆에 Insights 패널이 나타나요.
인사이트를 해결하려면 상세 보기를 열고 Insights 패널에서 Analyze with CoCo를 클릭해요. CoCo는 다음을 수행해요:
- 동적 테이블의 업스트림·다운스트림 의존성을 평가해요.
- 현재 SQL 구조가 왜 플래그된 패턴을 유발하는지 설명해요.
- 바로 쓸 수 있는 DDL(
CREATE OR ALTER DYNAMIC TABLE ...)을 생성해서 수정을 적용해요. - 변경 사항을 직접 검토하고 적용할 수 있게 해줘요.
인사이트가 있는 동적 테이블 목록을 보려면 다음 샘플 쿼리를 실행해도 돼요:
SELECT
recommendations:recommendations,
*
FROM
TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLES())
WHERE
ARRAY_SIZE(recommendations:recommendations) > 0;
인사이트 참조(Insights reference)
다음 표는 모든 인사이트 코드, 감지 내용, 그리고 권장 조치를 정리한 거예요.
| 인사이트 코드 | 인사이트 | 권장 사항 |
|---|---|---|
| AUTO_RESOLVED_TO_FULL_REFRESH | REFRESH_MODE = AUTO가 FULL로 결정됐어요. |
SHOW DYNAMIC TABLES나 INFORMATION_SCHEMA.DYNAMIC_TABLES()에서 REFRESH_MODE_REASON을 확인해 FULL이 선택된 이유를 보거나, 매 주기 전체 갱신이 허용 가능하다면 REFRESH_MODE = FULL을 명시적으로 설정하세요. |
| CHANGED_BASE_TABLES_UNDER_JOIN | 이 동적 테이블의 JOIN을 공급하는 테이블 중 하나 이상이 마지막 갱신 이후 변경된 행이 많아요. 변경이 많은 입력을 조인하면 증분 갱신 비용이 커져요. |
JOIN을 공급하는 테이블에서 변경을 유발하는 원인을 확인하세요. REFRESH_MODE = ADAPTIVE로 설정하면 증분 갱신 비용이 더 커질 때 Snowflake가 스스로 전체 재초기화(full reinitialization)로 전환할 수 있어요. |
| EXPENSIVE_ORDER_DEPENDENT_WINDOW_FUNCTION | 쿼리가 순서에 의존하는(order-dependent) 윈도우 함수를 사용해요. 각 행의 결과가 이웃 행에 의존하므로 갱신할 때마다 변경된 행뿐 아니라 전체 행 파티션을 다시 평가해야 해요. | REFRESH_MODE = FULL 사용을 고려하세요. 가능하다면 윈도우 함수를 증분에 더 유리한 패턴으로 바꾸는 것도 고려하세요. |
| HIGH_BASE_TABLE_CHANGES | 마지막 갱신 이후 기본 테이블의 높은 비율의 행이 변경됐어요. 변경률이 높으면 증분 유지보수 비용이 전체 갱신보다 높을 수 있어요. | 기본 테이블에서 큰 변경을 유발하는 원인을 확인하세요. REFRESH_MODE = ADAPTIVE로 설정하면 증분 갱신 비용이 더 커질 때 Snowflake가 스스로 전체 재초기화로 전환할 수 있어요. |
| ICEBERG_BASE_TABLE_V2_TO_V3 | 기본 테이블 중 하나 이상이 행 단위 변경을 추적하지 않는 Iceberg format version 2를 사용해요. 변경 추적이 없으면 갱신이 필요한 데이터보다 더 많이 읽어요. | 영향을 받는 기본 테이블을 Iceberg version 3로 업그레이드하면 갱신이 변경된 행만 읽을 수 있어요. |
| NON_MONOTONIC_GROUPING_KEY | 동적 테이블이 입력 순서를 보존하지 않는 비단조(non-monotonic) 함수로 그룹화해요. 갱신이 변경량에 비해 훨씬 많은 파티션을 다시 평가해요. | 비단조 그룹화 함수를 순서를 보존하는 함수로 바꾸세요. |
| QUALIFY_RANK_KEYS_NOT_PERSISTED | QUALIFY RANK()/ROW_NUMBER() = 1이 최외곽 SELECT에 있지만, 그 PARTITION BY와 ORDER BY 키가 동적 테이블의 출력 컬럼에 없어서 최고 속도 증분 경로를 사용할 수 없어요. |
PARTITION BY와 ORDER BY 키 표현식을 동적 테이블의 SELECT 목록에 추가해 출력 컬럼으로 저장되도록 하세요. |
| QUALIFY_RANK_NOT_TOP_LEVEL | QUALIFY RANK()/ROW_NUMBER() = 1 절이 최외곽 SELECT 대신 쿼리 안쪽에 중첩돼 있어 최고 속도 증분 경로를 사용할 수 없어요. |
QUALIFY RANK()/ROW_NUMBER() = 1 절이 최외곽 SELECT에 오도록 동적 테이블을 재구성하세요. |
| TOP_LEVEL_AGGREGATE_EXPRESSIONS_NOT_PERSISTED | 최외곽 GROUP BY는 증분 갱신이 가능하지만, 그에 의존하는 일부 표현식이 동적 테이블의 출력 컬럼에 없어 최고 속도 증분 경로를 사용할 수 없어요. |
나열된 표현식을 동적 테이블의 SELECT 목록에 추가해서 최고 속도 증분 경로를 사용할 수 있게 하세요. |
| TOP_LEVEL_AGGREGATE_NOT_TOP_LEVEL | 증분 유지보수가 가능한 집계(MIN, MAX, COUNT, SUM)가 있는 GROUP BY가 최외곽 SELECT 대신 쿼리 안쪽에 중첩돼 있어 빠른 재계산 경로를 사용하지 않아요. |
GROUP BY와 그 집계가 최외곽 SELECT에 오도록 동적 테이블을 재구성하세요. |
| WAREHOUSE_TOO_SMALL | 갱신 중 메모리가 부족해서 데이터가 로컬 또는 원격 스토리지로 넘쳐 나(spill) 느리고 비용이 많이 들었어요. | 이 동적 테이블의 갱신을 더 큰 웨어하우스에서 실행하세요. 자세한 내용은 dynamic tables용 웨어하우스 선택 문서를 참조하세요. |
모범 사례(Best practices)
- CoCo로 분석하면 인사이트를 분석·트러블슈팅·적용하는 데 가장 좋은 경험을 얻을 수 있어요.
- 최적화를 왼쪽으로(shift left): CI/CD 워크플로를 쓴다면 동적 테이블 정의의 구조적 문제를 프로덕션에 배포하기 전에 잡아내도록 CoCo 검사를 통합하세요.
- 고처리량 테이블을 정기적으로 감사: 고처리량 또는 미션 크리티컬 동적 테이블이 성능 병목의 영향을 가장 많이 받아요. 파이프라인이 진화하면서 새 문제를 잡아내도록 Dynamic Tables Insights를 모니터링하세요.