DML 권장사항

이 페이지에서는 DML(Data Manipulation Language) 및 Partitioned DML 사용을 위한 권장사항을 설명합니다.

WHERE 절을 사용하여 잠금 범위 축소

읽기-쓰기 트랜잭션 내에서 DML 문을 실행합니다. Cloud Spanner는 데이터를 읽을 때 읽은 행 범위의 제한된 부분에서 공유 읽기 잠금을 획득합니다. 구체적으로는 액세스하는 열에만 이러한 잠금을 획득합니다. 잠금에는 WHERE 절의 필터 조건과 일치하지 않는 데이터가 포함될 수 있습니다.

Cloud Spanner에서 DML 문을 사용하여 데이터를 수정하면 수정 중인 특정 데이터에서 배타적인 잠금을 획득합니다. 또한 데이터를 읽을 때와 같은 방법으로 공유 잠금을 획득합니다. 요청에 큰 행 범위나 전체 테이블이 포함된 경우 공유 잠금으로 인해 다른 트랜잭션을 동시에 완료하지 못할 수 있습니다.

데이터를 최대한 효율적으로 수정하려면 Cloud Spanner가 필요한 행만 읽을 수 있도록 하는 WHERE 절을 사용합니다. 이러한 경우 기본 키 또는 보조 색인 키의 필터를 사용하면 됩니다. WHERE 절은 공유 잠금의 범위를 제한하고 Cloud Spanner가 업데이트를 더 효율적으로 처리할 수 있도록 합니다.

예를 들어, Singers 테이블의 뮤지션 중 한 명이 이름을 변경하는 경우 데이터베이스에서 해당 이름을 업데이트해야 합니다. 다음 DML 문을 실행할 수 있지만 이 문은 Cloud Spanner가 전체 테이블을 강제로 스캔하도록 하며 전체 테이블을 포함하는 공유 잠금을 획득합니다. 그 결과 Cloud Spanner는 필요한 것보다 많은 데이터를 읽어야 하며 동시 트랜잭션은 데이터를 동시에 수정할 수 없습니다.

-- ANTI-PATTERN: SENDING AN UPDATE WITHOUT THE PRIMARY KEY COLUMN
-- IN THE WHERE CLAUSE

UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards";

업데이트를 더 효율적으로 수행하려면 WHERE 절에 SingerId 열을 포함합니다. SingerId 열은 Singers 테이블에 유일한 기본 키 열입니다.

-- RECOMMENDED: INCLUDING THE PRIMARY KEY COLUMN IN THE WHERE CLAUSE

UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards" AND SingerId = 1;

같은 트랜잭션에서 DML 문과 변형 사용 금지

Cloud Spanner는 서버 측에서 DML 문을 사용하여 수행된 삽입, 업데이트, 삭제를 버퍼링하며, 동일 트랜잭션 내 후속 SQL 및 DML 문에서 결과를 확인할 수 있습니다. 이 동작은 Cloud Spanner가 클라이언트 측에서 변형을 버퍼링하고 커밋 작업의 일부로 변형을 서버 측에 보내는 변형 API와 다릅니다. 그 결과 커밋 요청의 변형은 동일 트랜잭션 내의 SQL 또는 DML 문에 보이지 않습니다.

일부 작업은 변형 API에서만 지원되므로 같은 트랜잭션에서 DML 문과 변형을 조합하려 할 수도 있습니다. 한 가지 예시는 insert_or_update입니다. 트랜잭션이 커밋 요청에 DML 문과 변형을 모두 포함하는 경우, Cloud Spanner는 변형 전에 DML 문을 실행합니다. 클라이언트 라이브러리 코드에서 실행 순서를 고려하지 않으려면 DML 문이나 변형을 단일 트랜잭션에서 사용해야 하며 둘 다 사용하면 안 됩니다. 둘 다 사용하는 경우, 트랜잭션의 맨 마지막에서만 쓰기를 버퍼링해야 합니다.

PENDING_COMMIT_TIMESTAMP 함수를 사용하여 커밋 타임스탬프 작성

PENDING_COMMIT_TIMESTAMP 함수를 사용하여 DML 문에서 커밋 타임스탬프를 씁니다. Cloud Spanner는 트랜잭션이 커밋될 때 커밋 타임스탬프를 선택합니다.

Partitioned DML과 날짜 및 타임스탬프 함수

Partitioned DML은 실행 및 커밋 시간이 서로 다른 하나 이상의 트랜잭션을 사용합니다. 날짜 또는 타임스탬프 함수를 사용하면 수정된 행에 서로 다른 값이 포함될 수 있습니다.

배치 DML을 사용하여 단일 요청으로 여러 DML을 보냅니다.

배치 DML을 사용하여 단일 요청으로 여러 DML을 보냅니다. 이렇게 하면 클라이언트-서버 왕복이 한 번이면 되므로 지연 시간이 줄어듭니다.