DML

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

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

  • 표준 SQL을 사용해야 합니다. 표준 SQL을 사용 설정하려면 SQL 언어 전환을 참조하세요.
  • 대상 테이블을 지정할 수 없습니다. 예를 들어 Cloud Console에서 대상 테이블선택된 테이블 없음으로 설정해야 합니다.

    선택한 대상 테이블이 없는 Cloud Console

제한사항

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

  • 최근에 스트리밍(tabledata.insertall 메서드 사용)을 통해 테이블에 기록된 행은 UPDATE, DELETE, MERGE 문을 사용하여 수정할 수 없습니다. 일반적으로 최근 쓰기 작업은 최근 30분 내에 발생한 작업입니다. 테이블에 있는 다른 모든 행은 UPDATE, DELETE 또는 MERGE 문을 사용해서 수정 가능한 상태로 유지됩니다.

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

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

  • DML 문에는 테이블 메타데이터 업데이트 작업에 대한 비율 제한이 적용됩니다. 자세한 내용은 할당량 및 한도 문서의 DML 문을 참조하세요.

동시 작업

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

INSERT DML 동시 실행

24시간 동안 테이블로 INSERT되는 처음 1,000개의 문이 동시에 실행됩니다. 이 한도에 도달하면 테이블에 쓰는 INSERT 문의 동시 실행이 10개로 제한됩니다. 10개를 초과하는 모든 INSERT DML 작업은 PENDING 상태로 큐에 추가됩니다. 이전 작업이 완료되면 다음 PENDING 작업이 큐에서 제거되고 실행됩니다. 현재 특정 테이블에 대해 큐에 추가될 수 있는 INSERT DML 문은 최대 100개입니다.

UPDATE, DELETE, MERGE DML 동시 실행

UPDATE, DELETE, MERGE DML 문을 변형 DML 문이라고 합니다. 다른 변형 DML 작업이 여전히 실행 중이거나 대기 중일 때 테이블에 하나 이상의 변형 DML 문을 제출하는 경우 BigQuery는 이를 동시에 실행하며, 고정된 최대 수의 변형 DML 문을 동시에 실행합니다. 동시 실행 한도에 도달하면 BigQuery는 대기 상태에 있는 변형 DML 작업을 자동으로 큐에 추가합니다. 이전에 실행 중인 작업이 완료되면 다음 PENDING 작업이 큐에서 제거되고 실행됩니다.

6시간 넘게 큐에 있는 INTERACTIVE 우선순위 DML 작업은 실패합니다.

DML 문 충돌

테이블에서 동시에 변형 DML 문을 실행하면 변경사항이 충돌하여 실패할 수 있습니다. BigQuery는 이러한 실패를 다시 시도합니다.

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

  • UPDATE 또는 DELETE 절이 없고 INSERT 절만 포함된 MERGE DML 문은 동시에 실행되는 다른 DML 문과 충돌하지 않습니다.

  • MERGE 문이 기존 행을 업데이트하거나 삭제하지 않는 한 UPDATE 또는 DELETE 절을 포함하는 MERGE DML 문은 동시에 실행되는 다른 DML 문과 충돌하지 않습니다.

가격 책정

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

권장사항

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

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

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

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

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

    UPDATE s = "some string" WHERE id BETWEEN 54 AND 75
    

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

    UPDATE s = "some string" WHERE id IN (54, 57, 60)
    

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

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

다음 단계

  • DML 구문 페이지에서 DML 구문과 샘플을 참조하세요.