Snowflake SYSTEM$STREAM_HAS_DATA가 TRUE인데 0건일 수 있는 이유
스노우플레이크 스트림에서 스트림 해즈 데이터가 트루인데, 조회 결과가 영 건일 수 있습니다.

TRUE가 CDC 행 개수를 보장하지 않음table version metadata diff 기반원래 상태 복귀 또는 view가 변경행을 제외
스노우플레이크 스트림에서 스트림 해즈 데이터가 트루인데, 조회 결과가 영 건일 수 있습니다.
증상부터 분리
스노우플레이크 스트림에서 스트림 해즈 데이터가 트루인데, 조회 결과가 영 건일 수 있습니다.
공식 문서에서 확인되는 핵심
이 함수는 테이블 버전 메타데이터 차이를 보고 판단하므로, 트루가 실제 씨디씨 행이 있다는 보장은 아닙니다.
같은 행이 들어왔다가 지워져 원래 상태로 돌아가거나, 뷰가 변경된 행을 걸러내면 폴스 포지티브가 생길 수 있습니다.
다섯 장면으로 정리
| 장면 | 핵심 | 조건 |
|---|---|---|
| 1 | HAS_DATA = TRUE 그런데 0건?! | TRUE가 CDC 행 개수를 보장하지 않음 |
| 2 | TRUE = 메타데이터 차이 행 보장 아님 | table version metadata diff 기반 |
| 3 | 삽입 후 삭제·뷰 필터 false positive 가능 | 원래 상태 복귀 또는 view가 변경행을 제외 |
| 4 | 계속 TRUE면 불필요 Task 가능 | DML로 consume하면 stream offset 변경 |
| 5 | STALE_AFTER는 예측값 | 실제 손실·안전 상태 증거 아님 |
여기까지는 단정하면 안 됩니다
빈 스트림인데 트루가 계속되면 태스크가 불필요하게 실행될 수 있습니다. 스트림을 디엠엘로 소비하면 오프셋이 바뀌므로, 읽기 전용 확인과 구분해야 합니다.
설정 변경 전 읽기 전용 확인
- TRUE가 CDC 행 개수를 보장하지 않음
- table version metadata diff 기반
- 원래 상태 복귀 또는 view가 변경행을 제외
- DML로 consume하면 stream offset 변경
- 실제 손실·안전 상태 증거 아님
검증 범위
스테일 애프터는 예상 스테일니스 시점이지 특정 데이터 손실이나 안전 상태의 증거가 아닙니다. 실제 계정에서 디엠엘을 실행한 영상은 아닙니다.
이 글은 제조사 공식 문서를 해설하고 가상 도식을 사용한 교육 자료입니다. 실제 장비·운영 데이터베이스·고객 데이터·장애·복구·성능 시험 결과를 주장하지 않습니다.
- https://docs.snowflake.com/en/sql-reference/functions/system_stream_has_data
- https://docs.snowflake.com/en/user-guide/streams-manage
짧은 영상으로 보기
YouTube 예약 영상의 실제 ID가 생기면 이 링크만 연결할 수 있습니다. 글과 로컬 영상 자체는 독립적으로 확인 가능합니다.