2012-05-16 5 views
0

SSIS의 SQL Server 2008에서 큰 데이터 집합을로드하려고합니다. 그러나 Visual Studio가 모든 것을 한 번에로드하는 것은 너무 느립니다. 그런 다음 for-each 루프를 사용하여 매번 테이블의 일부분 만로드하기로 결정했습니다.큰 루프를로드하는 데 각 루프를 사용하는 방법

예. 1 천만 개의 레코드가있는 경우 매번 100 만 건씩로드하고 10 회 실행하여 처리를 완료하면 좋을 것입니다.

이것은 내 "두뇌 디자인"일 뿐이며 Foreach 루프 구성 요소로 어떻게 만들지 모릅니다. 대규모 데이터 세트를 다루는 다른 방법이 있습니까?

+0

전체 데이터 세트를 동시에 메모리에로드해야합니까? 또는 데이터 흐름을 일괄 적으로 처리 할 수 ​​있습니까? SSIS는 후자의 경우 배치 설정을 올바르게하면 좋습니다. 귀하의 답변에 – GShenanigan

답변

0

내 생각에 가장 좋은 방법은 기능적으로 데이터를 파티션하는 것입니다. 대부분의 경우 날짜 열이 적절합니다. 예를 들어 주문 날짜를 봅시다.

해당 열의 경우 가장 적합한 분모를 찾으십시오. 예를 들어 매년 주문 날짜가 약 백만 개의 행을 생성합니다.

대신 각 루프 컨테이너에 대해 for loop container을 사용하십시오.

이 루프가 작동하려면 원본 데이터에서 모든 주문 날짜의 최소 연도와 최대 연도를 찾아야합니다. 이들은 스칼라 결과를 SSIS 변수에 저장하는 SQL 문을 사용하여 검색 할 수 있습니다.

다음으로 반복문 당 1 년을 더한 변수에 저장 한 최소 및 최대 연도 사이를 루프하도록 for 루프 컨테이너를 설정합니다.

"SELECT * FROM transactions WHERE YEAR(OrderDate) = " + @[User::ForLoopCurrentYear] 
:

마지막으로, 실제로 데이터를 검색하려면 루프 컨테이너에 대한 생산의 현재 연도를 지정하는 where 절에 변수에 식으로 소스 SQL 문을 저장해야합니다

이제이 변수를 데이터 흐름 소스에서 사용하여 파티션 된 데이터를 검색 할 수 있습니다.

편집 :

유형 Object의 SSIS 변수에 그 결과 집합을 SQL 실행 작업에 파티션 키를 검색하는 것입니다 각 루프 컨테이너에 대한을 사용하고 절약 다른 솔루션 :

SELECT YEAR(OrderDate) FROM transaction GROUP BY YEAR(OrderDate) 

각 루프 컨테이너에 대해 ADO 열거자를 사용하여 개체를 반복하고 위의 방법과 동일한 방법을 사용하여 현재 연도를 원본 SQL 문에 삽입 할 수 있습니다.

+0

thx! 선택한 데이터를 매번 다른 테이블과 병합해야하므로 각 루프마다 사용해야합니다. 그렇지 않으면 처리 속도가 훨씬 더 빨라집니다. – Echo

1

많은 변수가 있으므로 5 분 안에 회의가 있습니다.

천천히 말하는군요. 무엇이이 느린가요? 그것을 알지 못하면 틀린 토끼를 영원히 쫓아 낼 수 있습니다.

SSIS는 2008 년에 ETL processing speed by loading 1TB in 30 minutes의 왕관을 받았습니다. 물론, 그들은 그것을하기 위해 시스템에서 모든 사랑스레 한 베제를 비틀었다. 그러나 그들은 그들이 취한 단계를 자세하게 설명했다.

10M 행은 큰 소리로 들리지만 SSIS에 과세하는 것으로 간주 할 수는 없습니다. 시작하려면 대상 객체를 살펴보십시오 (OLEDB라고 가정). 빠른로드 옵션을 선택하지 않은 경우 10M 단일 삽입 문을 실행합니다. 그것은 트랜잭션 로그를 늪에 빠뜨릴 것입니다. 또한 커밋 크기의 행 수를 살펴보십시오. 0은 복구 가능성에 따라 올바른 결정이 될 수도 있고 아닐 수도있는 모든 것을 의미하지만 트랜잭션 로그에 대한 의미를 인식합니다 (상당한 공간을 차지할 것입니다).

파이프 라인의 데이터에 어떤 변환을 적용 하시겠습니까? 처리량 (정렬, 집계 등)을 막을 변환이 있습니다

기준 패키지를 만들면 원본 위치에서 N 행의 데이터가 읽히고 행 수가 계산됩니다. 이는 하드웨어에 주어진 최상의 이론적 처리량을 이해하는 데 중요합니다.

Visual Studio/BIDS/SSDT에서 패키지를 실행하는 것이 디버거에서 실행을 래핑하지 않으므로 SQL Agent/dtexec를 통해 호출 할 때보 다 느린 경우가 있습니다.

시간이 있기 때문에이 답변을 수정 하겠지만 초기 생각은 있습니다. foreach 루프 태스크를 사용하여 회의 이후에 개별 데이터 청크를 처리하도록 게시 할 것입니다.

관련 문제