시간 여행 쿼리 구문 및 타임스탬프
쿼리 구문
하나 이상의 시간 절이 포함된 SELECT 쿼리는 시간 이동 쿼리입니다. 시간 여행 쿼리는 삽입, 업데이트, 삭제, 병합 또는 테이블을 SELECT로 생성(CTAS) 문에서 하위 SEL ECT로 나타날 수 있습니다.
또한 시간 이동 쿼리는 뷰 정의 (CREATE VIEW, OR REPLACE 포함 또는 미포함) 또는 저장 프로시저 정의 (CREATE PROCEDURE, OR REPLACE 포함 또는 미포함)에 나타날 수 있습니다. 두 경우 모두 구문의 타임스탬프 표현식(예: ' CURRENT_TIMESTAMP - INTERVAL ‘1 day’)은
뷰 또는 프로시저 정의 시점에 평가되지 않고 사용자 또는 애플리케이션이 뷰를 쿼리하거나 프로시저를 호출하는 시점에 평가됩니다.
SELECT 또는 sub-SELECT의 모든 기본 테이블 참조(데이터베이스 및 스키마 이름이 있거나 없는 테이블 이름, 별칭이 있거나 없는 별칭)에는 선택적 임시 절이 있을 수 있으며, 이 임시 절은 FOR SYSTEM_TIME 키워드 뒤에 다음 값 중 하나로 구성될 수 있습니다:
AS OF <TIMESTAMP EXPRESSION>BEFORE <TIMESTAMP EXPRESSION>BETWEEN <TIMESTAMP EXPRESSION 1> AND <TIMESTAMP EXPRESSION 2>FROM <TIMESTAMP EXPRESSION 1> TO <TIMESTAMP EXPRESSION 2>
각 ' TIMESTAMP EXPRESSION '은 다음 중 하나이어야 합니다:
- 리터럴 타임스탬프 값입니다. 예를 들면
‘2022-10-31 20:00:00’과(와) 같습니다. - 값이 타임스탬프인 쿼리 매개변수 또는 호스트 변수입니다.
- 타임스탬프를 반환하거나 암시적으로 변환하는 내장 함수입니다. 예를 들어 '
CURRENT_DATE, 'CURRENT_TIMESTAMP' 또는 (동등하게) 'NOW(), 'CURRENT_TIMESTAMP(subsecond-digits)' 또는 (동등하게) 'NOW(subsecond-digits)' 입니다. - 테이블의 모든 행에 대해 단일 타임스탬프로 평가하는 표현식입니다. 예를 들면
CURRENT_TIMESTAMP - INTERVAL ‘1 day’과(와) 같습니다. 표현식은 테이블 열이나 비결정적 함수(예: 'RANDOM())를 참조하거나 하위 셀렉트가 될 수 없습니다. - 특수 식별자 RETENTION_START_TIMESTAMP는 AS OF, BETWEEN, FROM의 특정 경우( BEFORE, AND, TO 제외)에만 사용됩니다. 이는 시간 이동 쿼리에 사용할 수 있는 가장 오래된 행 삽입 타임스탬프 또는 삭제 타임스탬프인 보존 시작 타임스탬프를 나타냅니다. 보존 시작 타임스탬프, 타임스탬프 삽입 및 타임스탬프 삭제에 대한 자세한 내용은 시간 이동 쿼리에서 타임스탬프를 참조하세요.
현재
과거 특정 시점의 데이터 상태를 그대로 검색하려는 경우 AS OF 하위 절을 사용할 수 있습니다.
| 구문 | 설명 |
|---|---|
| <타임스탬프 표현식 1> 기준 | 타임스탬프 표현식 1이 평가하는 타임스탬프에 유효하고 삽입 타임스탬프가 타임스탬프 표현식 1보다 작거나 같고 삭제 타임스탬프가 NULL이거나 타임스탬프 표현식 1보다 큰 모든 행을 포함합니다. 타임스탬프 표현식 1이 테이블의 보존 시작 타임스탬프보다 작으면 오류가 반환됩니다. |
이전
과거 특정 시간 직전의 데이터 상태를 검색하려는 경우 BEFORE 하위 절을 사용할 수 있습니다.
| 구문 | 설명 |
|---|---|
| 이전<TIMESTAMP EXPRESSION 1> | 타임스탬프 표현식 1이 평가하는 타임스탬프 직전에 유효했던 모든 행을 포함합니다. 삽입 타임스탬프가 타임스탬프 표현식 1보다 엄격하게 작고 삭제 타임스탬프가 NULL이거나 타임스탬프 표현식 1보다 큰 경우입니다. 타임스탬프 표현식 1이 테이블의 보존 시작 타임스탬프보다 작거나 같으면 오류가 반환됩니다. |
부터...까지, 그리고...그리고
데이터 감사 또는 추세 분석에 FROM...TO 및 BETWEEN...AND 하위 절을 사용할 수 있습니다. 일정 기간 동안 일부 또는 모든 행에 대한 모든 기록 변환을 가져와야 할 때 이 기능을 사용합니다.
| 구문 | 설명 |
|---|---|
| <타임스탬프 표현식 1>에서 <타임스탬프 표현식 2>로 변경합니다 | 타임스탬프 표현식 1에서 타임스탬프 표현식 2(독점)까지 언제든지 유효했던 모든 행을 포함하며, 삽입 타임스탬프가 타임스탬프 표현식 2보다 엄격하게 작고 삭제 타임스탬프가 NULL이거나 타임스탬프 표현식 1보다 큰 행입니다. 타임스탬프 표현식 1 또는 타임스탬프 표현식 2가 테이블의 보존 시작 타임스탬프보다 작거나 같으면 오류가 반환됩니다. 타임스탬프 표현식 1이 타임스탬프 표현식 2보다 크거나 같으면 쿼리에서 행이 생성되지 않습니다. |
| <TIMESTAMP EXPRESSION 1> - <TIMESTAMP EXPRESSION 2> 사이 | 타임스탬프 표현식 1과 타임스탬프 표현식 2(포함) 사이에 언제든지 유효했던 모든 행을 포함하며, 삽입 타임스탬프가 타임스탬프 표현식 2보다 작거나 같고 삭제 타임스탬프가 NULL이거나 타임스탬프 표현식 1보다 큰 행을 포함합니다. 타임스탬프 표현식 1 또는 타임스탬프 표현식 2가 테이블의 보존 시작 타임스탬프보다 작으면 오류가 반환됩니다. 타임스탬프 표현식 1이 타임스탬프 표현식 2보다 크면 쿼리에서 행이 생성되지 않습니다. |
시간 여행 쿼리의 타임스탬프
보존 시간 간격 및 보존 기간
테이블의 보존 시간 간격은 시간 이동 쿼리에 기록(삭제된) 행을 사용할 수 있는 삭제 타임스탬프 이후 경과한 일 수를 정의합니다. 언제든지 보존 기간은 현재 타임스탬프(날짜 및 시간)에서 종료되며 지정된 일수만큼 뒤로 연장됩니다. 현재 시스템 시간이 진행됨에 따라 슬라이딩되는 시간 창입니다.
보존 하한
대부분의 경우 테이블의 보존 하한은 테이블이 임시 테이블로 정의된 날짜와 시간입니다. 이는 CREATE TABLE 명령을 실행했을 때 또는 마지막으로 테이블의 DATA_VERSION_RETENTION_TIME을 0에서 0이 아닌 값으로 변경했을 때일 수 있습니다.
보존 시작 타임스탬프
테이블을 임시로 정의할 때(보존 하한이 정의된 경우) 보존 기간 동안 사용할 수 있는 기록 행이 없습니다. 시간 이동 쿼리에 표시되는 과거 행이 실제로 얼마나 오래 전에 사용 가능한지에 대한 개념을 캡처하기 위해 테이블의 보존 시작 타임스탬프가 정의됩니다. 보존 시작 타임스탬프는 다음 값 중 더 큰 값입니다:
- 보존 기간의 시작(현재 날짜/시간에서 보존 간격을 뺀 값)입니다.
- 보존 기간 하한선입니다.
테이블의 보존 시작 타임스탬프는 다음 작업에서 작동합니다:
-
시간 여행 쿼리 (SELECT 및 하위 선택)
보존 시작 타임스탬프 이전에 삭제된 기록 행에 대한 쿼리를 실행하려고 하면 오류가 반환됩니다.
가능한 한 과거 데이터를 쿼리하려면 시간 이동 쿼리에서 RETENTION_START_TIMESTAMP 키워드를 사용하면 됩니다. 이렇게 하면 올바른 타임스탬프를 직접 계산하지 않아도 됩니다. 이렇게 하면 값이 너무 오래된(보존 시작 타임스탬프보다 오래된) 값으로 판명될 경우 오류가 발생할 위험을 없앨 수 있습니다.
-
룸 테이블 보존 시작 타임스탬프 이전에 삭제된 기록 행은 더 이상 시간 이동 쿼리에 필요하지 않으므로 다시 가져올 수 있습니다.
행 타임스탬프 및 유효 기간
현재 또는 과거 행의 삽입 타임스탬프는 행을 삽입하는 트랜잭션이 커밋한 날짜/시간입니다. 행을 삽입한 특정 INSERT, UPDATE 또는 MERGE 문이 실행된 시점이 아닙니다.
보존 시작 타임스탬프 이전에 커밋된 행에 대한 삽입 트랜잭션이 있는 경우 해당 행은 보존 시작 타임스탬프에 삽입된 것으로 처리됩니다. 이는 일반적으로 비시간 테이블을 시간 테이블로 변경할 때 기존 행에만 적용됩니다.
트랜잭션이 아직 커밋되지 않은 삽입된 행에는 삽입 타임스탬프가 없습니다. 이러한 행은 시간 여행 쿼리에 표시되지 않습니다.
시간 여행 쿼리에서 임시 테이블의 _SYS_START 가상 열을 사용하여 삽입 타임스탬프를 선택할 수 있습니다.
기록 행의 삭제 타임스탬프는 행을 삭제하는 트랜잭션이 커밋된 날짜/시간입니다. 행을 삭제한 특정 DELETE, UPDATE, MERGE 또는 TRUNCATE 문이 실행된 시점이 아닙니다.
임시 테이블이 잘린 경우, 기존 테이블 행은 시간 이동 쿼리에서 사용할 수 있으며 잘린 트랜잭션이 커밋된 시점을 기준으로 삭제된 것으로 처리됩니다.
보존 시작 타임스탬프 이전에 삭제(또는 잘라내기) 트랜잭션이 커밋된 경우, 삭제된 행은 보존 시작 타임스탬프에 삭제된 것으로 처리됩니다. 이는 일반적으로 비시간 테이블을 시간 테이블로 변경할 때 기존에 삭제된 행에만 적용되며, 이러한 행은 테이블에 대한 시간 이동 쿼리에는 표시되지 않습니다.
삭제 타임스탬프가 테이블의 보존 기간 내에 속하는 경우 테이블에 대한 임시 쿼리에 기록 행이 표시될 수 있습니다. 이 조건이 참이면 테이블에서 기록 행을 제거할 수 없습니다( GROOM TABLE 사용).
현재 행의 삭제 타임스탬프(삭제되지 않았거나 삭제하도록 표시되었지만 커밋되지 않음)는 NULL입니다.
시간 이동 쿼리에서 임시 테이블의 _SYS_END 가상 열을 사용하여 삭제 타임스탬프를 선택할 수 있습니다.
기록 행은 삽입 타임스탬프부터 삭제 타임스탬프 직전까지 유효한 것으로 간주됩니다. 현재 행은 삽입 타임스탬프 이후부터 유효한 것으로 간주됩니다. 시간 이동 쿼리는 타임스탬프 또는 타임스탬프 표현식을 사용하여 특정 시점 또는 기간 내 어느 시점에 유효한 행(현재 또는 과거)만 반환합니다.
최근에 삽입 및 삭제된 행의 삽입 및 삭제 타임스탬프는 삽입 및 삭제 트랜잭션이 커밋된 후 짧은 시간(일반적으로 3분 미만)까지 시간 이동 쿼리에 사용할 수 없을 수 있습니다.