카테고리:

쿼리 구문

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