SYSTEM$STREAM_HAS_DATA
SYSTEM$STREAM_HAS_DATA
지정된 스트림이 변경 데이터 캡처(CDC) 레코드를 포함하는지 여부를 나타내요.
본문
구문
SYSTEM$STREAM_HAS_DATA('<stream_name>')
인자
조회할 스트림의 이름이에요.
- 전체 이름은 데이터베이스와 스키마를 포함해(이름이 완전 정규화된 경우) 작은따옴표로 묶어야 해요. 즉
'<db>.<schema>.<stream_name>'. - 스트림 이름이 대소문자를 구분하거나 특수 문자나 공백을 포함하면 대소문자/문자를 처리하기 위해 큰따옴표가 필요해요. 큰따옴표는 작은따옴표 안에 묶여야 해요. 즉
'"<stream_name>"'.
사용상 주의사항
- 이 함수는 태스크 정의의 WHEN 표현식에서 사용하도록 의도되었어요. 지정된 스트림에 변경 데이터가 없으면 태스크가 현재 실행을 건너뛰어요. 이 확인은 웨어하우스를 불필요하게 시작하거나 다시 시작하는 것을 피하는 데 도움이 돼요. 단, 이 함수는 오탐(false negative, 스트림에 변경 데이터가 있는데도 false 값을 반환)을 피하도록 설계되었지만, 오탐(false positive, 스트림에 변경 데이터가 없는데도 true 값을 반환)을 피하는 것은 보장되지 않아요.
- 이 함수는 스트림에 CDC 레코드가 포함되어 있는지 확인하기 위해 테이블 버전 메타데이터(스트림 오프셋과 현재 트랜잭션 시간 사이)의 diff를 수행해요. 해당 기간 동안 테이블에 대한 DML 활동이 동일한 행 집합이 삽입되고, 선택적으로 업데이트되고, 삭제되어 원래 테이블 상태로 돌아간 것으로 구성되었다면, 이 함수는 스트림에 CDC 레코드가 없음에도 TRUE 값을 반환할 수 있어요.
- 입력이 뷰 스트림일 때 기본 테이블의 CDC 레코드가 변경되면 반환 값은 TRUE예요. 함수는 뷰 자체가 아니라 기본 테이블의 버전 메타데이터에 대한 diff를 수행해요. 소스 뷰 정의의 쿼리가 변경된 기본 테이블의 행을 참조하지 않으면 결과는 오탐이에요. 뷰가 더 선택적이 될수록 오탐 비율이 증가해요. 이 함수가 태스크 정의의 선택적 WHEN 파라미터에서 참조될 때 오탐 비율이 더 높다는 것은, 테이블 스트림이 함수의 입력일 때보다 뷰 스트림이 비어 있을 때 태스크가 더 자주 실행될 수 있다는 뜻이에요. 그러나 이 확인은 여전히 기본 테이블 데이터에 변경이 없을 때 태스크 실행을 피해요.
- 스트림에 이 함수를 호출하면, 스트림이 비어 있고 SYSTEM$STREAM_HAS_DATA 함수가 FALSE를 반환하는 한 스트림이 오래되지 않도록(stale) 방지해요.
- 이 함수가 TRUE를 반환하면 오탐이든 실제 변경 데이터든 스트림을 DML 작업에서 소비(consume)해야 해요. 스트림을 소비하지 않으면 이 함수는 계속 TRUE를 반환하고, WHEN 절에서 이 함수를 사용하는 태스크는 실행을 건너뛰지 않아요. 이로 인해 불필요한 태스크 실행과 웨어하우스 요금이 발생해요.
- 결과가 오탐일 때 스트림을 효율적으로 소비하려면(예: 스트림 조회가 레코드를 반환하지 않는 경우) 다음 예시 같은 문을 사용해요.
CREATE TEMPORARY TABLE _unused_table AS SELECT * FROM my_stream WHERE 1=0;
이 문은 CREATE TABLE AS SELECT가 DML 트랜잭션이므로 스트림을 소비하는 DML 작업으로 간주돼요. WHERE 1=0 절이 모든 데이터를 필터링하므로 처리되거나 저장되는 것이 없어요. 이 작업은 스트림 오프셋을 진행시키고, 새 변경이 발생할 때까지 SYSTEM$STREAM_HAS_DATA가 FALSE를 반환해요.
- 또는 스트림에 일반 데이터 처리 로직(INSERT, UPDATE, MERGE 또는 기타 DML 문)을 실행해요. 이것도 스트림을 소비하고 오프셋을 진행시켜요. 스트림에 변경 레코드가 없을 때도 마찬가지예요.
예시
create table MYTABLE1 (id int);
create table MYTABLE2(id int);
create stream MYSTREAM on table MYTABLE1;
insert into MYTABLE1 values (1);
-- returns true because the stream contains change tracking information
select system$stream_has_data('MYSTREAM');
+----------------------------------------+
| SYSTEM$STREAM_HAS_DATA('MYSTREAM') |
|----------------------------------------|
| True |
+----------------------------------------+
-- consume the stream
begin;
insert into MYTABLE2 select id from MYSTREAM;
commit;
-- returns false because the stream was consumed
select system$stream_has_data('MYSTREAM');
+----------------------------------------+
| SYSTEM$STREAM_HAS_DATA('MYSTREAM') |
|----------------------------------------|
| False |
+----------------------------------------+