카테고리:

쿼리 구문

AT | BEFORE

AT 또는 BEFORE 절은 Snowflake Time Travel에 사용됩니다. 쿼리에서 이는 테이블 이름 바로 뒤의 FROM 절에 지정되며, 오브젝트에 대해 과거 데이터가 요청되는 과거 시점을 결정합니다.

  • AT 키워드는 지정된 매개 변수와 동일한 타임스탬프를 갖는 문 또는 트랜잭션에 의해 수행된 모든 변경 사항을 요청이 포함하도록 지정합니다.

  • BEFORE 키워드는 요청이 지정된 매개 변수 바로 앞의 지점을 참조하도록 지정합니다.

자세한 내용은 Time Travel 이해 및 사용하기 섹션을 참조하십시오.

참고 항목:

FROM

구문

SELECT ...
FROM ...
  {
   AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) |
   BEFORE( STATEMENT => <id> )
  }
[ ... ]
Copy
TIMESTAMP => timestamp

Time Travel에 사용할 정확한 날짜와 시간을 지정합니다. 값은 명시적으로 TIMESTAMP에 캐스팅되어야 합니다.

OFFSET => time_difference

Time Travel에 사용할 현재 시간과의 초 단위 차이를 -N 형식으로 지정합니다. 여기서 N 은 정수 또는 산술 식일 수 있습니다(예: -120 은 120초, -30*60 은 1800초 또는 30분).

STATEMENT => id

Time Travel의 기준점으로 사용할 문의 쿼리 ID를 지정합니다. 이 매개 변수는 다음 형식 중 하나의 문을 지원합니다.

  • DML(예: INSERT, UPDATE, DELETE)

  • TCL(BEGIN, COMMIT 트랜잭션)

  • SELECT

쿼리 ID는 지난 14일 이내에 실행된 쿼리를 참조해야 합니다. 쿼리 ID가 14일이 지난 쿼리를 참조하는 경우 다음 오류가 반환됩니다.

Error: statement <query_id> not found

이 제한을 해결하려면 참조된 쿼리에 대한 타임스탬프를 사용하십시오.

STREAM => 'name'

쿼리된 테이블 또는 뷰의 기존 스트림에 대한 식별자(즉, 이름)를 지정합니다. 스트림의 현재 오프셋은 원본 오브젝트에 대한 변경 데이터를 반환하기 위한 AT 시점으로 사용됩니다.

이 키워드는 스트림을 생성하거나(CREATE STREAM 사용) 변경 데이터를 쿼리할 때만(CHANGES 절 사용) 지원됩니다. 예를 들어 다음 항목을 참조하십시오.

사용법 노트

  • Snowflake의 데이터는 시스템 시간의 정확한 값과는 약간 다를 수 있는 타임스탬프로 식별됩니다.

  • TIMESTAMP 또는 OFFSET의 값은 상수 식이어야 합니다.

  • TIMESTAMP의 최소 시간 해상도는 밀리초입니다.

  • 요청된 데이터가 Time Travel 보존 기간(기본값은 1일)을 초과하는 경우, 문이 실패합니다.

    또한, 요청된 데이터가 Time Travel 보존 기간 내에 있지만, 사용 가능한 과거 데이터가 없는 경우(예: 보존 기간이 연장된 경우), 문이 실패합니다.

  • 지정된 Time Travel 시간이 오브젝트의 생성 시점 또는 그 이전인 경우 문이 실패합니다.

  • 기록 테이블 데이터에 액세스하면 테이블의 현재 정의에 있는 열, 기본값 등이 결과에 포함됩니다. 구체화되지 않은 뷰에도 동일하게 적용됩니다. 예를 들어 테이블을 변경하여 열을 추가하는 경우 열이 추가된 시점 이전의 기록 데이터를 쿼리하면 새 열이 포함된 결과가 반환됩니다.

  • 과거 데이터에는 현재 데이터와 동일한 액세스 제어 요구 사항이 있습니다. 모든 변경 사항은 소급 적용됩니다.

문제 해결

오류

Time travel data is not available for table <tablename>

원인

어떤 경우에는 이는 타임스탬프가 필요한 문자열을 사용하여 발생합니다.

해결책

문자열을 타임스탬프로 캐스팅합니다.

... AT(TIMESTAMP => '2018-07-27 12:00:00')               -- fails
... AT(TIMESTAMP => '2018-07-27 12:00:00'::TIMESTAMP)    -- succeeds
Copy

특정 타임스탬프를 사용하여 테이블에서 과거 데이터를 선택합니다.

SELECT * FROM my_table AT(TIMESTAMP => 'Fri, 01 May 2015 16:20:00 -0700'::timestamp);
Copy
SELECT * FROM my_table AT(TIMESTAMP => TO_TIMESTAMP(1432669154242, 3));
Copy

5분 전 시점의 테이블에서 과거 데이터를 선택합니다.

SELECT * FROM my_table AT(OFFSET => -60*5) AS T WHERE T.flag = 'valid';
Copy

테이블에서부터, 지정된 트랜잭션에 의해 변경된 사항(해당 변경 사항 제외)까지의 과거 데이터를 선택합니다.

SELECT * FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
Copy

지정된 트랜잭션으로 인한 테이블 데이터의 차이를 반환합니다.

SELECT oldt.* ,newt.*
  FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS oldt
    FULL OUTER JOIN my_table AT(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS newt
    ON oldt.id = newt.id
WHERE oldt.id IS NULL OR newt.id IS NULL;
Copy