2012-11-29 1 views
4

큰 데이터 마이그레이션 작업에 SSIS 2012를 사용하고 있습니다.2 백만 레코드를 루프하고 각 행의 특정 조건에 따라 업데이트 또는 삽입 집합을 생성하는 최상의 성능

나는 최선의 접근 방법을 모르고 완료해야만한다.

표 A는210 만 레코드입니다.

나는 각 행을 반복해야합니다

1 단계 업데이트 일부 텍스트 조작을하고 복잡한 서브 쿼리의 결과와 특정 분야를

2 단계 잡아 TableA의 행의 이메일 필드에서 이메일 주소
2a. 사용자 표 검색
2b. 이메일이 있으면 ID를 얻고 TableA 행에 UserId를 업데이트하십시오.
2c. 이메일이 존재하지 않는 경우 - User 테이블에 새 레코드를 INSERT하고 ID를 가져 와서 TableA 행의 UserId를 업데이트하십시오.

1 단계와 2 단계를 동시에 수행 할 필요는 없습니다. 이러한 작업은 별도의 관련이 없으므로 데이터 흐름.

커서를 사용하여이 모든 것을 작성할 수 있습니다. 커서를 사용하는 일반적인 규칙은 싫은 일입니다.

새로운 MERGE 함수를 사용하여 위의 1 단계에서 순수한 SQL 스크립트를 작성했습니다. 이 서브 쿼리는 뷰를 호출하여 Scale 함수를 사용하여 복잡한 텍스트 조작을 수행합니다. SSIS를 통해 1 시간 12 분 동안 실행 된 후 SSIS는 디스크 공간이 부족한 tembDB.log 때문에 폭탄을 터뜨렸습니다.

내 쿼리가 이전에 실행 한 SSIS 패키지에서 tembDB 또는 다른 것을 벗어나는 원인인지 확실하지 않습니까? 어떻게 알 수 있습니까?

위의 1 단계와 2 단계를 모두 달성하기 위해 SSIS에서 최상의 도구에 대한 정보를 얻은 사람이 있습니까?

+0

데이터를 표시해야하고 1 단계를 실행하려고하는 쿼리 (쿼리)가 필요하다고 생각합니다. – Justin

+0

큰 MERGE 문을 수행 할 때 중요한 것은 수정중인 열에 인덱스가 있는지 확인하는 것입니다. 그렇다면 업데이트/삽입 속도가 느려질 것입니다. 열에 인덱스를 놓고 MERGE를 실행 한 다음 인덱스를 다시 만듭니다. – tranceporter

답변

1

원시 SQL 대신 SSIS를 사용하는 것이 무엇인지 압니까. 일반 데이터 피드가 아닌 일회성 작업입니까? 일회성이라면 소스 데이터를 대상 DB의 스테이징 테이블 (또는 동일한 서버의 별도 스테이징 DB)로 가져오고 거기에 복잡한 작업을 수행해야합니다. SSIS는 반복적이고 정기적 인 데이터 피드에 적합합니다. 이것이 필요하지 않다면, 나는 SQL로 갈 것이다.

(TBH SSIS의 고급 기능인 행 수준 작업에 대해 아직 살펴 보지 못했습니다.)

당신은 별도의 세트에서 작동하는 두 개의 SQL 문으로 2 단계를 나눌 수 :

을 수행합니다. 전자 메일이 존재하는 행 세트.

b. 전자 메일이 존재하지 않는 행 집합

시작하기 전에 행을 "선별 (triage)"하는 것은 개별 행이 아니라 행을 구성합니다. 두 세트가 전체 테이블을 덮고 있는지 몇 가지 신중하게 확인하십시오. SSIS를 선호하는 경우 SSIS를 선호한다면 SSIS의 개별 데이터 흐름에서이 작업을 수행 할 수 있습니다 (원본 DB를 사용하면 전체 테이블을 덤프하는 대신 원본 SQL을 사용하여 SQL을 실행할 수 있습니다).

0

1 단계에서 "복잡한 하위 쿼리"에 해당하는 SSIS는 일반적으로 조회가있는 데이터 흐름입니다."텍스트 조작"/ "스칼라 함수"와 같은 SSIS는 대개 스크립트 변환이있는 데이터 흐름입니다. T-SQL에서 코딩 할 수있는 모든 조작은 .NET에서 수행 할 수 있습니다. .NET 라이브러리를 활용할 수 있습니다. Regex, HTMLEncode 등을 사용하면 더 우아하고 빠르게 실행될 수 있습니다.

2 단계에서 TableA의 고유 한 전자 메일 값을 제공하는 OLE DB 원본으로 새 데이터 흐름을 시작합니다. 그런 다음 조회 변환을 추가하여 "사용자 테이블"을 확인하십시오. 무시하고 일치하지 않는 행을 OLE DB 대상에 보내 사용자 테이블에 삽입합니다.

그런 다음 모든 TableA 행을 가져 와서 "사용자 테이블"값을 조회하고 스테이징 테이블에 해당 로트를 삽입하는 다른 데이터 흐름을 추가하십시오. TableA에 모든 것을 다시 가져와야하는 경우이 시점에서이를 자르고 다시로드 할 수 있습니다. 업데이트 또는 커서보다 훨씬 빠릅니다.