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
'SQL Server > SSIS 강좌' 카테고리의 다른 글
열 가져오기 - BLOB(Binary Large Object) 데이터를 저장하자 (0) | 2015.07.16 |
---|---|
병합 조인( 두 개의 입력된 데이터를 조인 하자) (0) | 2015.07.16 |
플랫파일 대상 - 데이터를 텍스트로 저장하자 (0) | 2015.07.16 |
SORT - 데이터를 정렬 하자 (0) | 2015.07.16 |
UNION ALL - 데이터를 합치자 (0) | 2015.07.16 |