트랜잭션 및 Apache Iceberg™ 테이블

이 항목에서는 Snowflake가 Apache Iceberg™ 테이블의 트랜잭션을 구체적으로 처리하는 방법에 대한 정보를 제공합니다. Snowflake 트랜잭션 항목에 설명된 규칙은 Iceberg 테이블에도 적용됩니다.

Snowflake를 카탈로그로 사용하는 테이블

Snowflake를 카탈로그로 사용하는 테이블 의 경우, Spark와 같은 다른 쿼리 엔진이 테이블에서 읽을 수 있도록 Snowflake가 Iceberg 메타데이터를 관리합니다.

쿼리

Snowflake를 사용하여 이러한 유형의 테이블을 쿼리하는 경우 테이블은 일반적인 Snowflake 트랜잭션 원칙을 따릅니다.

Snowflake는 현재 동시성과 처리량 향상을 위해 트랜잭션에 대한 읽기 커밋 격리 를 지원하며, Iceberg는 현재 직렬화 가능 또는 스냅샷 격리를 지원합니다.

DDL 문

Snowflake는 DDL 문을 개별 트랜잭션으로 처리하며 여러 동시 트랜잭션에서 DDL 문을 격리하지 않습니다. 자세한 내용은 암시적 트랜잭션의 DDL 섹션을 참조하십시오.

이는 일반적으로 하나의 커밋된 트랜잭션에 DML 및 DDL 문 또는 여러 개의 번들 DDL 문이 모두 포함될 수 있는 DDL 문이 있는 트랜잭션을 처리하는 Iceberg 테이블의 일반적인 방식과 다릅니다.

참고

  • Iceberg 메타데이터에는 각 개별 DDL 변경에 대해 항상 새로운 스키마 버전이 표시되는 것은 아닙니다. 경우에 따라 Snowflake는 DDL 문을 함께 그룹화하고 이 그룹을 하나의 새로운 스키마 버전으로 Iceberg 메타데이터에 기록합니다.

  • 특히 DDL 변경이 다른 DDL 또는 DML 작업과 근접하여 발생하는 경우 DDL 변경이 Iceberg 메타데이터에 순서대로 표시되지 않을 수 있습니다.

외부 엔진에서 Snowflake 관리 테이블에 쓰기

Snowflake는 현재 Spark와 같은 외부 쿼리 엔진에서 Snowflake가 관리하는 테이블에 대한 쓰기를 지원하지 않습니다.

외부 카탈로그를 사용하는 테이블

외부 카탈로그를 사용하는 Iceberg 테이블의 경우, ALTER ICEBERG TABLE … REFRESH 명령을 실행하면 Snowflake가 외부 카탈로그에서 최신 테이블 상태를 검색합니다.

트랜잭션 새로 고침

Snowflake는 단일 문 트랜잭션 내에서 ALTER ICEBERG TABLE … REFRESH 문을 자동으로 커밋합니다.

암시적 트랜잭션 에서 Snowflake는 AUTOCOMMIT 가 활성화된 경우 다른 문을 처리하는 것과 동일한 방식으로 문을 처리합니다.

명시적 트랜잭션 (여러 문이 포함된)에서는 명시적 트랜잭션 블록을 커밋하기 전에 Snowflake가 단일 문 트랜잭션으로 새로 고침을 실행하고 자동으로 커밋합니다.

외부 관리 테이블에 쓰기

Snowflake는 현재 외부 관리 테이블에 대한 쓰기를 지원하지 않습니다.

다중 문 트랜잭션

Snowflake는 여러 개의 DML 문을 원자적으로 커밋하여 다중 문 트랜잭션을 지원하며, 다음과 같은 논리를 사용합니다.

  • 각 DDL 문은 발생 시 개별 트랜잭션으로 실행됩니다.

  • 각 ALTER ICEBERG TABLE … REFRESH 작업은 발생 시 단일 트랜잭션으로 실행됩니다.

  • 명시적 트랜잭션 또는 암시적 트랜잭션 내의 다른 모든 문은 그룹화되어 단일 트랜잭션으로 커밋됩니다.

다음 예제는 Snowflake의 Iceberg 테이블에 대한 명시적 트랜잭션 블록의 예제입니다.

BEGIN
  INSERT INTO table1 VALUES (1, "One");
  INSERT INTO table1 VALUES (2, "Two");
  ALTER ICEBERG TABLE table1 ALTER COLUMN c3 SET DATA TYPE ARRAY(long);
  INSERT INTO table1 VALUES (3, "Three");
  INSERT INTO table1 VALUES (4, "Four");
COMMIT;
Copy
  1. ALTER ICEBERG TABLE 문이 발생하면 Snowflake는 처음 두 개의 INSERT INTO TABLE 문(지금까지 처리된 모든 문)을 트랜잭션으로 커밋합니다.

  2. 그런 다음 Snowflake는 ALTER ICEBERG TABLE 문을 별도의 트랜잭션으로 커밋합니다.

  3. 마지막으로 Snowflake는 새 트랜잭션을 생성하고 나머지 INSERT INTO 문을 처리합니다. 블록의 나머지 부분에는 DDL 또는 새로 고침 문이 없기 때문에 블록의 끝(COMMIT)에 나머지 트랜잭션을 커밋합니다.