DML(Data Manipulation Language)으로 데이터 변환

BigQuery DML을 사용하면 BigQuery 테이블에서 데이터를 업데이트, 삽입, 삭제할 수 있습니다.

다음 조건에 따라 SELECT 문을 실행할 때와 같은 방식으로 DML 문을 실행할 수 있습니다.

  • GoogleSQL을 사용해야 합니다. GoogleSQL을 사용 설정하려면 SQL 언어 전환을 참조하세요.
  • 쿼리의 대상 테이블을 지정할 수 없습니다.

BigQuery DML 문 목록과 사용 방법에 대한 예시는 GoogleSQL의 DML 문을 참조하세요.

제한사항

  • 각 DML 문은 암시적 트랜잭션을 시작합니다. 즉, 각 DML 문이 성공적으로 종료될 때마다 문에서 발생한 변경사항이 자동으로 커밋됩니다.

  • tabledata.insertall 스트리밍 메서드를 사용하여 최근에 작성한 행은 UPDATE, DELETE, MERGE 또는 TRUNCATE 문 같은 DML(Data Manipulation Language)을 사용하여 수정할 수 없습니다. 최근 쓰기 작업이란 최근 30분 내에 발생한 작업입니다. 테이블에 있는 다른 모든 행은 UPDATE, DELETE, MERGE 또는 TRUNCATE 문을 통해 수정 가능한 상태로 유지됩니다. 스트리밍된 데이터를 복사 작업에 사용할 수 있게 될 때까지 최대 90분이 소요될 수 있습니다.

    또는 최근에 Storage Write API를 사용하여 작성한 행은 UPDATE, DELETE 또는 MERGE 문을 사용하여 수정할 수 있습니다. 자세한 내용은 최근 스트리밍된 데이터에 DML 사용을 참조하세요.

  • when_clause, search_condition, merge_update_clause, merge_insert_clause 내의 상관 서브 쿼리는 MERGE 문에 지원되지 않습니다.

  • DML 문을 포함하는 쿼리는 와일드 카드 테이블을 쿼리 대상으로 사용할 수 없습니다. 예를 들어 와일드 카드 테이블은 UPDATE 쿼리의 FROM 절에서 사용할 수 있지만 와일드 카드 테이블을 UPDATE 작업의 대상으로 사용할 수는 없습니다.

동시 작업

BigQuery는 테이블의 행을 추가, 수정 또는 삭제하는 DML 문의 동시 실행을 관리합니다.

INSERT DML 동시 실행

INSERT 문 첫 1500개가 제출된 후 24시간 동안 즉시 실행됩니다. 이 한도에 도달하면 테이블에 쓰는 INSERT 문의 동시 실행이 10개로 제한됩니다. 추가 INSERT 문이 PENDING 큐에 추가됩니다. 특정 시점에 테이블에 대해 INSERT 문을 최대 100개까지 큐에 추가할 수 있습니다. INSERT 문이 완료되면 다음 INSERT 문이 큐에서 삭제되고 실행됩니다.

DML INSERT 문을 더 자주 실행해야 하는 경우 Storage Write API를 사용하여 데이터를 테이블로 스트리밍하는 것이 좋습니다.

UPDATE, DELETE, MERGE DML 동시 실행

UPDATE, DELETE, MERGE DML 문을 변형 DML 문이라고 합니다. 다른 변형 DML 작업을 실행 중이거나 대기 중인 경우 테이블에 있는 변형 DML 문을 한 개 이상 제출하는 경우 BigQuery는 최대 2개까지 동시 실행하며 최대 20개까지 PENDING 상태로 큐에 추가될 수 있습니다. 이전에 실행 중인 작업이 완료되면 다음 대기 중 작업이 큐에서 제거되고 실행됩니다. 큐에 추가된 변형 DML 문은 최대 길이가 20인 테이블별 큐를 공유합니다. 각 테이블의 최대 큐 길이를 초과한 추가 문은 실패하고 오류 메시지 Resources exceeded during query execution: Too many DML statements outstanding against table PROJECT_ID:TABLE, limit is 20.이 표시됩니다.

6시간 넘게 큐에 추가된 대화형 우선순위 DML 작업이 실패하고 다음 오류 메시지가 표시됩니다.

DML statement has been queued for too long

DML 문 충돌

테이블에서 동시에 실행되는 DML 문을 변형하면 DML 문이 동일한 파티션을 변형하려고 할 때 DML 문이 충돌합니다. 문이 동일한 파티션을 수정하지 않는 한 성공합니다. BigQuery는 실패한 문을 최대 3회까지 재실행을 시도합니다.

  • 테이블에 행을 삽입하는 INSERT DML 문은 동시에 실행되는 다른 DML 문과 충돌하지 않습니다.

  • MERGE DML 문이 행만 삽입하고 기존 행을 삭제하거나 업데이트하지 않는 한, 이 문은 동시에 실행되는 다른 DML 문과 충돌하지 않습니다. 여기에는 UPDATE 또는 DELETE 절이 있는 MERGE 문을 포함될 수 있습니다(쿼리가 실행될 때 해당 절이 호출되지 않는 한).

가격 책정

DML 가격에 대한 자세한 내용은 가격 페이지의 데이터 조작 언어 가격을 참조하세요.

권장사항

최상의 성능을 위해 다음 패턴을 사용하는 것이 좋습니다.

  • 개별 행 업데이트 또는 삽입을 다수로 제출하지 마십시오. 대신 가능한 경우 DML 작업을 함께 그룹화합니다. 자세한 내용은 단일 행을 업데이트 또는 삽입하는 DML 문을 참조하세요.

  • 업데이트 또는 삭제 작업이 일반적으로 이전 데이터에서 또는 특정 날짜 범위 내에서 수행되는 경우 테이블의 파티션 나누기를 고려하세요. 파티션 나누기는 변경사항이 테이블 내의 특정 파티션으로 제한되도록 보장합니다.

  • 각 파티션의 데이터 양이 적고 각 업데이트가 파티션의 상당 부분을 수정하는 경우 파티션 나누기를 피하세요.

  • 하나 이상의 열이 좁은 값 범위 내에 있는 행을 자주 업데이트하는 경우 클러스터링된 테이블을 사용하는 것이 좋습니다. 클러스터링은 변경사항을 특정 블록 세트로 제한하여 읽고 써야 하는 데이터 양을 줄입니다. 다음은 열 값의 범위를 필터링하는 UPDATE 문의 예시입니다.

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id BETWEEN 54 AND 75;

    다음은 소량의 열 값 목록을 필터링하는 유사한 예시입니다.

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id IN (54, 57, 60);

    이러한 경우에는 id 열의 클러스터링을 고려하세요.

  • OLTP 기능이 필요한 경우 BigQuery에서 Cloud SQL에 있는 데이터를 쿼리할 수 있는 Cloud SQL 통합 쿼리를 사용하는 것이 좋습니다.

쿼리 성능을 최적화할 수 있는 권장사항은 쿼리 성능 최적화 소개를 참조하세요.

다음 단계

  • DML 구문 정보와 샘플은 DML 구문을 참조하세요.
  • 예약된 쿼리에서 DML 문을 사용하는 방법은 쿼리 예약을 참조하세요.