MERGE 명령을 사용하지 않고 열 목록을 지정하여 병합 작업 수행
절차에 자세히 설명된 병합 작업을 실행할 때는 모든 단계를 단일 트랜잭션에 포함시키십시오. 임의 단계가 실패하면 트랜잭션이 롤백됩니다. 단일 트랜잭션을 사용하면 커밋의 수도 줄어들어 시간과 자원을 절약할 수 있습니다.
열 목록을 지정하여 병합 작업을 수행하려면
-
전체 작업을 단일 트랜잭션 블록에 넣습니다.
BEGIN transaction; … END transaction;
-
다음 유사 코드에 나온 것처럼 스테이징 테이블을 생성한 다음 병합될 데이터로 테이블을 채웁니다.
create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
-
스테이징 테이블과의 내부 조인을 사용하여 대상 테이블을 업데이트합니다.
-
UPDATE 절에서 업데이트될 열을 명시적으로 나열합니다.
-
스테이징 테이블과의 내부 조인을 수행합니다.
-
분산 키가 기본 키와 다르고 분산 키가 업데이트되지 않는 경우, 분산 키에서 중복 조인을 추가합니다. 쿼리가 배치된 조인을 사용할지 확인하려면 EXPLAIN과 함께 쿼리를 실행하고 모든 조인에서 DS_DIST_NONE을 확인합니다. 자세한 내용은 쿼리 계획 평가 섹션을 참조하세요.
-
대상 테이블이 타임스탬프 기준으로 정렬된 경우 대상 테이블에서 범위 제한 스캔을 활용하기 위해 술어를 추가합니다. 자세한 내용은 Amazon Redshift 쿼리 설계 모범 사례 단원을 참조하십시오.
-
병합에서 사용하지 않는 행이 있는 경우, 변경할 행을 필터링하기 위해 절을 추가합니다. 예를 들어 하나 이상의 열에서 부등식 필터를 추가하여 변경되지 않은 행을 제외합니다.
-
문제가 생기면 모든 것을 롤백할 수 있도록 업데이트 작업, 삭제 작업, 삽입 작업을 단일 트랜잭션 블록에 넣습니다.
예:
begin transaction; update target set col1 = stage.col1, col2 = stage.col2, col3 = 'expression' from stage where target.primarykey = stage.primarykey and target.distkey = stage.distkey and target.col3 > 'last_update_time' and (target.col1 != stage.col1 or target.col2 != stage.col2 or target.col3 = 'filter_expression');
-
-
대상 테이블과의 내부 조인을 사용하여 스테이징 테이블에서 필요 없는 행을 삭제합니다. 대상 테이블의 행 중에는 스테이징 테이블의 행과 이미 일치하는 행도 있고 이전 단계에서 업데이트된 행도 있습니다. 어느 경우건 이 행들은 삽입에 필요하지 않습니다.
delete from stage using target where stage.primarykey = target.primarykey;
-
스테이징 테이블에서 나머지 행을 삽입합니다. VALUES 절에 2단계에서 UPDATE 문에 사용한 것과 동일한 열 목록을 사용합니다.
insert into target (select col1, col2, 'expression' from stage); end transaction;
-
스테이징 테이블을 삭제합니다.
drop table stage;