- 카테고리:
시스템 함수 (시스템 정보)
SYSTEM$STREAM_HAS_DATA¶
지정된 스트림에 변경 데이터 캡처(CDC) 레코드가 포함되어 있는지 여부를 나타냅니다.
구문¶
SYSTEM$STREAM_HAS_DATA('<stream_name>')
인자¶
stream_name쿼리할 스트림의 이름입니다.
데이터베이스와 스키마(이름이 정규화된 경우)를 포함하여 전체 이름을 작은따옴표로 묶어야 합니다. 즉,
'<db>.<스키마>.<스트림_이름>'이어야 합니다.스트림 이름이 대/소문자를 구분하거나 특수 문자나 공백이 포함된 경우, 대/소문자를 처리하려면 큰따옴표가 필요합니다. 큰따옴표는 작은따옴표로 묶어야 합니다. 즉,
'"<스트림_이름>"'이어야 합니다.
사용법 노트¶
이 함수는 작업 정의에서 WHEN 식에 사용하기 위한 것입니다. 지정된 스트림에 변경 데이터가 포함되어 있지 않은 경우, 작업이 현재 실행을 건너뜁니다. 이 검사는 웨어하우스를 불필요하게 시작하거나 재개하는 것을 방지하는 데 도움이 될 수 있습니다. 그러나 함수는 가음성(즉, 스트림에 변경 데이터가 포함된 경우에도 false 값 반환)을 방지하도록 설계되었지만, 이 함수는 가양성(즉, 스트림에 변경 데이터가 포함되지 않은 경우 true 값 반환)을 방지하는 것으로 보장되지는 않습니다.
이 함수는 스트림에 CDC 레코드가 포함되어 있는지 여부를 확인하기 위해 테이블 버전 메타데이터(스트림 오프셋과 현재 트랜잭션 시간 사이)에 대한 diff를 수행합니다. 해당 기간 동안 테이블에 대한 DML 활동이 삽입, 선택적으로 업데이트, 삭제되는 동일한 행 세트로 구성되어 원래 테이블 상태로 돌아가는 경우, 스트림이 CDC 레코드를 포함하지 않더라도 이 함수가 TRUE 값을 반환할 수 있습니다.
입력이 뷰 스트림인 경우, 기본 테이블 에 대한 변경 데이터 캡처(CDC) 레코드가 변경될 때 반환 값은
TRUE입니다. 이 함수는 뷰 자체가 아니라 기본 테이블에 대한 버전 메타데이터에서 diff를 수행합니다. 변경된 기본 테이블의 행을 소스 뷰 정의의 쿼리가 참조하지 않는 경우 결과는 가양성입니다. 뷰가 더 선택적으로 될수록 가양성 비율이 증가합니다.이 함수가 작업 정의의 선택적
WHEN매개 변수에서 참조되는 경우, 가양성 비율이 높다는 것은 테이블 스트림이 함수에 대한 입력일 때보다 뷰 스트림이 비어 있을 때 작업이 더 자주 실행될 수 있음을 의미합니다. 그러나 이 검사는 기본 테이블 데이터에 변경 사항이 없을 때 여전히 작업 실행을 방지합니다.스트림이 비어 있고 SYSTEM$STREAM_HAS_DATA 함수가
FALSE를 반환하는 경우, 스트림에서 이 함수를 호출하면 스트림이 부실해지는 것을 방지할 수 있습니다.이 함수가 TRUE를 반환하는 경우 가양성인지 또는 실제 변경 데이터인지 여부에 관계없이 DML 작업에서 스트림을 사용해야 합니다. 스트림을 사용하지 않는 경우 이 함수는 ``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 | +----------------------------------------+