

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# MERGE 명령을 사용하지 않고 열 목록을 지정하여 병합 작업 수행
<a name="merge-specify-a-column-list"></a>

절차에 자세히 설명된 병합 작업을 실행할 때는 모든 단계를 단일 트랜잭션에 포함시키세요. 임의 단계가 실패하면 트랜잭션이 롤백됩니다. 단일 트랜잭션을 사용하면 커밋의 수도 줄어들어 시간과 자원을 절약할 수 있습니다.

**열 목록을 지정하여 병합 작업을 수행하려면**

1. 전체 작업을 단일 트랜잭션 블록에 넣습니다.

   ```
   BEGIN transaction;
   … 
   END transaction;
   ```

1. 다음 유사 코드에 나온 것처럼 스테이징 테이블을 생성한 다음 병합될 데이터로 테이블을 채웁니다.

   ```
   create temp table stage (like target); 
   insert into stage 
   select * from source 
   where source.filter = 'filter_expression';
   ```

1. 스테이징 테이블과의 내부 조인을 사용하여 대상 테이블을 업데이트합니다.
   + UPDATE 절에서 업데이트될 열을 명시적으로 나열합니다.
   + 스테이징 테이블과의 내부 조인을 수행합니다.
   + 분산 키가 기본 키와 다르고 분산 키가 업데이트되지 않는 경우, 분산 키에서 중복 조인을 추가합니다. 쿼리가 배치된 조인을 사용할지 확인하려면 [EXPLAIN](r_EXPLAIN.md)과 함께 쿼리를 실행하고 모든 조인에서 DS\$1DIST\$1NONE을 확인합니다. 자세한 내용은 [쿼리 계획 평가](c_data_redistribution.md) 섹션을 참조하세요.
   + 대상 테이블이 타임스탬프 기준으로 정렬된 경우 대상 테이블에서 범위 제한 스캔을 활용하기 위해 술어를 추가합니다. 자세한 내용은 [Amazon Redshift 쿼리 설계 모범 사례](c_designing-queries-best-practices.md) 섹션을 참조하세요.
   + 병합에서 사용하지 않는 행이 있는 경우, 변경할 행을 필터링하기 위해 절을 추가합니다. 예를 들어 하나 이상의 열에서 부등식 필터를 추가하여 변경되지 않은 행을 제외합니다.
   + 문제가 생기면 모든 것을 롤백할 수 있도록 업데이트 작업, 삭제 작업, 삽입 작업을 단일 트랜잭션 블록에 넣습니다.

    예: 

   ```
   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');
   ```

1. 대상 테이블과의 내부 조인을 사용하여 스테이징 테이블에서 필요 없는 행을 삭제합니다. 대상 테이블의 행 중에는 스테이징 테이블의 행과 이미 일치하는 행도 있고 이전 단계에서 업데이트된 행도 있습니다. 어느 경우건 이 행들은 삽입에 필요하지 않습니다.

   ```
   delete from stage 
   using target 
   where stage.primarykey = target.primarykey;
   ```

1. 스테이징 테이블에서 나머지 행을 삽입합니다. VALUES 절에 2단계에서 UPDATE 문에 사용한 것과 동일한 열 목록을 사용합니다.

   ```
   insert into target
   (select col1, col2, 'expression'
   from stage);
   
   end transaction;
   ```

1. 스테이징 테이블을 삭제합니다.

   ```
   drop table stage;
   ```