SQL Server/SSIS 강좌

병합 - 두개의 입력 데이터를 합치자 (UNION ALL과 다름)

SungWookKang 2015. 7. 16. 09:33
반응형

SSIS – 병합 (두개의 입력 데이터를 합치자)

 

SSIS - 병합  기능에 대해서 알아 보도록 하겠습니다.

   

병합은 UNION ALL 과 비슷하지만 조금 다른 기능 입니다.

차이점에 대해서 먼저 알아보고 실습을 하도록 하겠습니다.

   

병합

조건

UNION ALL

두 개만 가능

입력

다수 가능

동일 해야 함

데이터 타입

동일 해야 함

첫번째 입력열의 기준

데이터 길이

상관 없음

입력 데이터가 반드시 정렬 되어 있어야 함

정렬형태

상관 없음

   

   

실습을 통해서 병합의 기능과 UNION ALL 의 차이점을 확인 해보도록 하겠습니다.

   

   

1. 우선 실습에 사용할 데이터를 생성 합니다. 데이터는 AdventureWorks 데이터베이스의 Person.Address 테이블 입니다.

   

아래 그림처럼 Person.Address 테이블에서 AdressID, AdressLine1 컬럼만 

[Test_Address2], [Test_Address3] 테이블로 복사 합니다.

   

그리고 동일 형식의 타입으로 [Test_Address3] 테이블을 생성 합니다.

 

 

 

   

   

2.BIDS (Business Intelligence Developement Studio)를 실행 하여 프로젝트를 생성 합니다.

[데이터 흐름 태스크] 를 추가 합니다.

 

 

 

3. [데이터 흐름] 탭에서 아래 그림과 같이 작업을 추가 합니다.


 

 

   

4. [Test_Address] 원본을 병합으로 끌어 놓으면 그림과 같은 [입/출력] 선택창이 나타 납니다.

(병합은 오직 두 개의 데이터 입력만 가능합니다.)

   

Test_Address (병합 입력 1)

Test_Address (병합 입력 2)

 

 

   

5. [병합] 작업에서 편집을 선택하면 [패키지 유효성 검사 오류]가 발생 합니다.

왜 발생할까요?

   

위에서 설명하였듯이 병합은 반드시 정렬된 조건으로 입력이 되어야 합니다.

   

즉 현재 입력 데이터는 정렬된 데이터이다!  라는 것을 알려주어야 합니다.

 

 

   

6. 그래서 현재 입력 데이터는 정렬된 것이다!! 라는것을 알려주기 위한 두가지 방법이 있습니다.

   

(1) Sort 작업을 이용하여 정렬된 데이터를 입력한다. :  실제 테스트 테이블의 데이터는 정렬되어 있지만 DB는 알 수 없습니다.

그래서 정렬 작업을 중간에 삽입함으로써 정렬된 데이터 라는것을 알려 줍니다.

   

(2) 데이터 속성에서 정렬된 데이터라고 강제 지정 합니다.

   

7. 정렬을 이용한 방법 :  아래 그림처럼 정렬 작업을 중간에 추가하여 정렬된 데이터임을 지정 합니다.

(정렬에 관한 포스팅 : http://blog.naver.com/jevida/140148804730)

   

 

 

   

8. Test_Addrss2 에서 [고급 편집기(A)]를 선택 합니다.

 

 

   

9. 편집기에서 [입/출력 속성] 탭을 선택 합니다.

   

아래 그림처럼 IsSorted 항목을 True 로 선택 합니다. (해당 입력 속성은 정렬되어 있다 라고 강제 지정 한다는 뜻입니다.)

 

 

   

10. 그리고 [출력 열]을 확장하여 정렬키를 지정 합니다.

정렬키는 AddressID 에서 SortKeyPostion 을 1로 설정 합니다.

   

[SortKeyPostion 속성]

1: 오름차순 (ASC)

-1 : 내림차순 (DESC) 

 

 

   

11. 설정이 완료 되었으면 실행 합니다.

   

녹색 : 정상실행. 

 

빨간색 : 오류.

 

 

   

12. SSMS에서 데이터가 정상적으로 입력되었는지 확인 합니다.
데이터가 입력 된 것을 확인 할 수 있습니다.


 

 

   

그렇다면 UNION AL 과의 차이점을 무엇일까요?

   

   

13. UNION ALL 과의 차이점을 비교 하기 위해 UNION ALL 작업을 추가 합니다.

   

SSMS에서 Test_Address3 와 같은 동일 형식의 테이블 Test_Address4 를 생성 합니다.

   

긔록 아래 그림처럼 SSIS 작업을 추가 합니다.

   

(아래 흐름을 이해 하지 못하시는 독자들은 지금까지 포스팅을 다시 한번 복습 바랍니다.)



 

 

   

   

14. 입력된 데이터를 비교해 보도록 하겠습니다.

   

병합 과 UNIONN ALL 의 차이점을 찾으 셧나요?

   

(1) 병합 :  2개의 입력 데이터가 정렬되어 저장 됩니다.

(2) UNION ALL  :  선행 입력 뒤에 후행 입력이 덧붙여 지는 형식 입니다.

 

 

   

이렇게 해서 병합에 대해서 살펴 보았습니다.

 UNION ALL 과 약간의 차이점이 있지만 명백히 다른 기능인 것을 확인 할 수 있습니다.  

   

그렇다면

정렬 이전  UNION ALL 을 먼저 하고 정렬 작업을 하면  병합기능과 동일 하지 않을까?

라고 생각하시는 독자가 분명이 있으이라 생각 합니다...

(아무 생각없이 따라하기만 하신건 아니죠? ㅡ.ㅡ)

   

이 때에는 상황에 따라 잘 판단하여야 합니다.

   

100만건의 데이터 입력이 10개 있다고 가정 할때 

(1) UNION ALL을 해서 1000만건을 정렬을 할것인지?

(2) 100만건씩 병합을 해서 9번의 병합 작업을 하여 1000만건을 처리 할 것인지?

   

이때는 서버의 메모리가 많을경우 전자의 방식을. 메모리가 부족할 경우에는 후자를 추천 합니다.

   

하지만 항상 모든 작업은 비지니스 환경에 맞게 스스로 결정 해야합니다.

 

강성욱 / http://sqlmvp.kr

 

 

반응형