다음을 통해 공유


데이터 흐름 성능 기능

적용 대상: SQL Server Azure Data Factory의 SSIS Integration Runtime

이 항목에서는 일반적인 성능 문제를 방지하기 위해 Integration Services 패키지를 디자인하는 방법에 대한 제안을 제공합니다. 이 항목에서는 패키지 성능 문제를 해결하는 데 사용할 수 있는 기능 및 도구에 대한 정보도 제공합니다.

데이터 흐름 구성

성능 향상을 위해 데이터 흐름 태스크를 구성하려면 태스크의 속성을 구성하고, 버퍼 크기를 조정하고, 병렬 실행을 위해 패키지를 구성할 수 있습니다.

데이터 흐름 태스크의 속성 구성

참고 항목

이 섹션에 설명된 속성은 패키지의 각 데이터 흐름 태스크에 대해 개별적으로 설정해야 합니다.

성능에 영향을 미치는 데이터 흐름 태스크의 다음 속성을 구성할 수 있습니다.

  • 버퍼 데이터의 임시 스토리지 위치(BufferTempStoragePath 속성) 및 BLOB(Binary Large Object) 데이터(BLOBTempStoragePath 속성)가 포함된 열의 위치를 지정합니다. 기본적으로 이러한 속성에는 TEMP 및 TMP 환경 변수의 값이 포함됩니다. 임시 파일을 다른 또는 더 빠른 하드 디스크 드라이브에 배치하거나 여러 드라이브에 분산하도록 다른 폴더를 지정할 수 있습니다. 디렉터리 이름을 세미콜론으로 구분하여 여러 디렉터리를 지정할 수 있습니다.

  • DefaultBufferSize 속성을 설정하여 태스크에서 사용하는 버퍼의 기본 크기를 정의하고 DefaultBufferMaxRows 속성을 설정하여 각 버퍼의 최대 행 수를 정의합니다. 버퍼의 기본 크기를 DefaultBufferMaxRows 속성 값에서 자동으로 계산할지 여부를 나타내는 AutoAdjustBufferSize 속성을 설정합니다. 기본 버퍼 크기는 10MB이며 최대 버퍼 크기는 2^31-1바이트입니다. 기본적으로 최대 행 수는 10,000개입니다.

  • EngineThreads 속성을 설정하여 실행 중에 태스크가 사용할 수 있는 스레드 수를 설정합니다. 이 속성은 사용할 스레드 수에 대한 제안 사항을 데이터 흐름 엔진에 제공합니다. 기본값은 10이며 최소값은 3입니다. 그러나 엔진은 이 속성의 값에 관계없이 필요한 것보다 많은 스레드를 사용하지 않습니다. 동시성 문제를 방지하기 위해 필요한 경우 엔진에서 이 속성에 지정된 것보다 많은 스레드를 사용할 수도 있습니다.

  • 데이터 흐름 태스크가 최적화된 모드(RunInOptimizedMode 속성)에서 실행되는지 여부를 나타냅니다. 최적화 모드는 데이터 흐름에서 사용되지 않는 열, 출력 및 구성 요소를 제거하여 성능을 향상시킵니다.

    참고 항목

    이름이 같은 속성인 RunInOptimizedMode를 SSDT(SQL Server Data Tools)의 프로젝트 수준에서 설정하여 디버깅 중에 데이터 흐름 태스크가 최적화된 모드에서 실행됨을 나타낼 수 있습니다. 이 프로젝트 속성은 디자인 타임에 데이터 흐름 작업의 RunInOptimizedMode 속성을 재정의합니다.

버퍼 크기 조정

데이터 흐름 엔진은 단일 데이터 행의 예상 크기를 계산하여 버퍼 크기 조정 태스크를 시작합니다. 그런 다음 예상 행 크기를 DefaultBufferMaxRows 값으로 곱하여 버퍼 크기의 예비 작업 값을 구합니다.

  • AutoAdjustBufferSize가 true로 설정된 경우 엔진 데이터 흐름 엔진은 계산된 값을 버퍼 크기로 사용하고 DefaultBufferSize 값은 무시됩니다.

  • AutoAdjustBufferSize를 false로 설정하면 데이터 흐름 엔진은 버퍼 크기를 결정하기 위해 다음 규칙을 사용합니다.

    • 결과가 DefaultBufferSize 값보다 큰 경우 엔진은 행 수를 줄입니다.

    • 결과가 내부적으로 계산된 최소 버퍼 크기보다 작으면 엔진은 행 개수를 늘립니다.

    • 결과가 최소 버퍼 크기와 DefaultBufferSize 값 사이에 있으면, 엔진은 버퍼를 예상된 행 크기에 DefaultBufferMaxRows 값을 곱한 값에 최대한 가깝게 설정합니다.

데이터 흐름 태스크의 성능 테스트를 시작할 때 DefaultBufferSize 및 DefaultBufferMaxRows의 기본값을 사용합니다. 데이터 흐름 태스크에서 로깅을 사용하도록 설정하고 BufferSizeTuning 이벤트를 선택하여 각 버퍼에 포함된 행 수를 확인합니다.

버퍼 크기 조정을 시작하기 전에 불필요한 열을 제거하고 데이터 형식을 적절하게 구성하여 각 데이터 행의 크기를 줄이는 것이 가장 중요합니다.

최적의 버퍼 수와 해당 크기를 확인하려면 Performance 및 BufferSizeTuning 이벤트에서 보고한 정보를 모니터링하면서 DefaultBufferSize 및 DefaultBufferMaxRows 값을 실험합니다.

디스크에 대한 페이징이 시작되는 지점까지 버퍼 크기를 늘리지 마세요. 디스크에 페이징하면 최적화되지 않은 버퍼 크기보다 성능이 저하됩니다. 페이징이 발생하는지 여부를 확인하려면 MMC(Microsoft Management Console)의 성능 스냅인에서 "버퍼 스풀" 성능 카운터를 모니터링합니다.

병렬 실행을 위한 패키지 구성

병렬 실행은 여러 물리적 또는 논리적 프로세서가 있는 컴퓨터의 성능을 향상시킵니다. 패키지 내의 다른 작업들을 병렬로 실행하기 위해 Integration Services는 MaxConcurrentExecutablesEngineThreads 두 속성을 사용합니다.

MaxConcurrentExcecutables 속성

MaxConcurrentExecutables 속성은 패키지 자체의 속성입니다. 이 속성은 동시에 실행할 수 있는 작업 수를 정의합니다. 기본값은 -1입니다. 즉, 물리적 또는 논리 프로세서의 수와 2를 더한 값입니다.

이 속성의 작동 방식을 이해하려면 데이터 흐름 태스크가 세 개 있는 샘플 패키지를 고려합니다. MaxConcurrentExecutables를 3으로 설정하면 세 개의 데이터 흐름 태스크가 모두 동시에 실행될 수 있습니다. 그러나 각 데이터 흐름 태스크에는 10개의 원본-대상 실행 트리가 있다고 가정합니다. MaxConcurrentExecutables를 3으로 설정하면 각 데이터 흐름 태스크 내에서 실행 트리가 병렬로 실행되지 않을 수 있습니다.

EngineThreads 속성

EngineThreads 속성은 각 데이터 흐름 태스크의 속성입니다. 이 속성은 데이터 흐름 엔진이 병렬로 만들고 실행할 수 있는 스레드 수를 정의합니다. EngineThreads 속성은 데이터 흐름 엔진이 원본에 대해 만드는 원본 스레드와 엔진이 변환 및 대상을 위해 만드는 작업자 스레드 모두에 동일하게 적용됩니다. 따라서 EngineThreads를 10으로 설정하면 엔진이 최대 10개의 원본 스레드와 최대 10개의 작업자 스레드를 만들 수 있습니다.

이 속성의 작동 방식을 이해하려면 세 가지 데이터 흐름 태스크가 있는 샘플 패키지를 고려합니다. 각 데이터 흐름 태스크에는 10개의 원본-대상 실행 트리가 포함됩니다. 각 데이터 흐름 태스크에서 EngineThreads를 10으로 설정하면 30개의 실행 트리가 모두 동시에 실행될 수 있습니다.

참고 항목

스레딩에 대한 자세한 설명은 이 항목에서는 다루지 않습니다. 그러나 일반적인 규칙은 사용 가능한 프로세서 수보다 더 많은 스레드를 병렬로 실행하는 것이 아닙니다. 사용 가능한 프로세서 수보다 더 많은 스레드를 실행하면 스레드 간의 빈번한 컨텍스트 전환으로 인해 성능이 저하될 수 있습니다.

개별 데이터 흐름 구성 요소 구성

성능 향상을 위해 개별 데이터 흐름 구성 요소를 구성하려면 따라야 할 몇 가지 일반적인 지침이 있습니다. 원본, 변환 및 대상과 같은 각 데이터 흐름 구성 요소 유형에 대한 특정 지침도 있습니다.

일반 지침

데이터 흐름 구성 요소에 관계없이 성능을 향상시키기 위해 따라야 하는 두 가지 일반적인 지침인 쿼리 최적화와 불필요한 문자열 방지가 있습니다.

쿼리 최적화

많은 데이터 흐름 구성 요소가 원본에서 데이터를 추출할 때나 참조 테이블을 만들기 위해 조회 작업에서 쿼리를 사용합니다. 기본 쿼리는 SELECT * FROM <tableName> 구문을 사용합니다. 이 유형의 쿼리는 원본 테이블의 모든 열을 반환합니다. 디자인 타임에 모든 열을 사용할 수 있도록 만들면 모든 열을 조회, 통과 또는 원본 열로 선택할 수 있습니다. 그러나 사용할 열을 선택한 후에는 선택한 열만 포함하도록 쿼리를 수정해야 합니다. 불필요한 열을 제거하면 더 작은 행을 만드는 열이 적기 때문에 패키지의 데이터 흐름이 더 효율적입니다. 행이 작을수록 더 많은 행이 하나의 버퍼에 들어갈 수 있고 데이터 세트의 모든 행을 처리하는 작업이 줄어듭니다.

쿼리를 생성하려면 쿼리를 입력하거나 쿼리 작성기를 사용할 수 있습니다.

참고 항목

SSDT(SQL Server Data Tools)에서 패키지를 실행하면 SSIS 디자이너의 진행률 탭에 경고가 나열됩니다. 이러한 경고에는 원본이 데이터 흐름에서 사용할 수 있지만 이후 다운스트림 데이터 흐름 구성 요소에서 사용되지 않는 데이터 열 식별이 포함됩니다. RunInOptimizedMode 속성을 사용하여 이러한 열을 자동으로 제거할 수 있습니다.

불필요한 정렬 피하기

정렬은 본질적으로 느린 작업이며 불필요한 정렬을 방지하면 패키지 데이터 흐름의 성능이 향상될 수 있습니다.

다운스트림 구성 요소에서 사용되기 전에 원본 데이터가 이미 정렬된 경우가 있습니다. 이러한 사전 정렬은 SELECT 쿼리가 ORDER BY 절을 사용하거나 데이터가 정렬된 순서로 원본에 삽입된 경우에 발생할 수 있습니다. 이러한 미리 정렬된 원본 데이터의 경우 데이터가 정렬되었다는 힌트를 제공할 수 있으므로 정렬 변환을 사용하여 특정 다운스트림 변환의 정렬 요구 사항을 충족하지 않도록 할 수 있습니다. 예를 들어 병합 및 병합 조인 변환에는 정렬된 입력이 필요합니다. 데이터가 정렬되어 있음을 나타내는 힌트를 제공하려면 다음 태스크를 수행해야 합니다.

  • 업스트림 데이터 흐름 구성 요소의 출력에 있는 IsSorted 속성을 True로 설정합니다.

  • 데이터가 정렬되는 정렬 키 열을 지정합니다.

자세한 내용은 병합 및 병합 조인 변환을 위한 데이터 정렬을 참조하세요.

데이터 흐름에서 데이터를 정렬해야 하는 경우 가능한 한 적은 수의 정렬 작업을 사용하도록 데이터 흐름을 디자인하여 성능을 향상시킬 수 있습니다. 예를 들어 데이터 흐름에서 멀티캐스트 변환을 사용하여 데이터 세트를 복사합니다. 변환 후 여러 출력을 정렬하는 대신 멀티캐스트 변환이 실행되기 전에 데이터 세트를 한 번 정렬합니다.

자세한 내용은 정렬 변환, 병합 변환, 병합 조인 변환멀티캐스트 변환을 참조하세요.

원본

OLE DB 원본

OLE DB 원본을 사용하여 뷰에서 데이터를 검색하는 경우 데이터 액세스 모드로 "SQL 명령"을 선택하고 SELECT 문을 입력합니다. SELECT 문을 사용하여 데이터에 액세스하는 것은 데이터 액세스 모드로 "테이블 또는 뷰"를 선택하는 것보다 성능이 좋습니다.

변환

이 섹션의 제안을 사용하여 집계, 유사 항목 조회, 유사 항목 그룹화, 조회, 병합 조인 및 느린 변경 차원 변환의 성능을 향상시킬 수 있습니다.

집계 변환

집계 변환에는 Keys KeysScale, CountDistinctKeysCountDistinctScale 속성이 포함됩니다. 이러한 속성은 변환에서 변환이 캐시하는 데이터에 필요한 메모리 양을 미리 할당할 수 있도록 하여 성능을 향상시킵니다. 작업별로 그룹에서 발생할 것으로 예상되는 정확한 또는 대략적인 Group by 연산 결과를 알고 있는 경우 KeysKeysScale 속성을 각각 설정합니다. Distinct count 연산으로 인해 발생할 것으로 예상되는 정확한 또는 대략적인 고유 값 수를 알고 있는 경우 CountDistinctKeysCountDistinctScale 속성을 각각 설정합니다.

데이터 흐름에서 여러 집계를 만들어야 하는 경우 여러 변환을 만드는 대신 하나의 집계 변환을 사용하는 여러 집계를 만드는 것이 좋습니다. 이 방법은 변환이 내부 스토리지를 최적화하고 들어오는 데이터를 한 번만 검색할 수 있으므로 한 집계가 다른 집계의 하위 집합인 경우 성능을 향상시킵니다. 예를 들어 집계에서 GROUP BY 절 및 AVG 집계를 사용하는 경우 이를 하나의 변환으로 조합하면 성능을 향상시킬 수 있습니다. 그러나 한 집계 변환 내에서 여러 집계를 수행하면 집계 작업이 직렬화되므로 여러 집계를 독립적으로 계산해야 하는 경우 성능이 향상되지 않을 수 있습니다.

유사 항목 조회 및 유사 항목 그룹화 변환

유사 항목 조회 및 유사 항목 그룹화 변환의 성능 최적화에 대한 정보는 SQL Server Integration Services 2005의 백서인 유사 항목 조회와 유사 항목 그룹화를 참조합니다.

조회 변환

필요한 열만 조회하는 SELECT 문을 입력하여 메모리에서 참조 데이터의 크기를 최소화합니다. 이 옵션은 불필요한 많은 양의 데이터를 반환하는 전체 테이블 또는 뷰를 선택하는 것보다 더 나은 성능을 제공합니다.

병합 조인 변환

Microsoft에서 병합 조인 변환에서 과도한 메모리를 사용할 위험을 줄이는 변경을 했기 때문에 더 이상 MaxBuffersPerInput 속성의 값을 구성할 필요가 없습니다. 과도한 메모리가 사용되는 문제는 여러 병합 조인 입력에서 균일하지 않은 속도로 데이터를 생성하는 경우에 발생합니다.

Slowly Changing Dimension Transformation

느린 변경 차원 마법사와 느린 변경 차원 변환은 대부분의 사용자의 요구를 충족하는 범용 도구입니다. 그러나 마법사에서 생성하는 데이터 흐름은 성능을 위해 최적화되지 않습니다.

일반적으로 느린 변경 차원 변환에서 가장 느린 구성 요소는 한 번에 하나의 행에 대해 UPDATE를 수행하는 OLE DB 명령 변환입니다. 따라서 느린 변경 차원 변환의 성능을 향상시키는 가장 효과적인 방법은 OLE DB 명령 변환을 대체하는 것입니다. 이러한 변환을 준비 테이블로 업데이트할 모든 행을 저장하는 대상 구성 요소로 바꿀 수 있습니다. 그런 다음 모든 행에 대해 단일 집합 기반 Transact-SQL UPDATE를 동시에 수행하는 SQL 실행 태스크를 추가할 수 있습니다.

고급 사용자는 큰 차원에 최적화된 느린 변경 차원 처리를 위해 사용자 지정 데이터 흐름을 디자인할 수 있습니다. 이 방법에 대한 설명 및 예는 백서 Project REAL: 비즈니스 인텔리전스 ETL 디자인 방법의 "고유 차원 시나리오" 섹션을 참조하십시오.

도착지

대상에서 성능을 향상시키려면 SQL Server 대상을 사용하고 대상의 성능을 테스트하는 것이 좋습니다.

SQL Server 대상

패키지가 같은 컴퓨터에 있는 SQL Server 인스턴스에 데이터를 로드하면 SQL Server 대상을 사용합니다. 이 대상은 고속 대량 로드에 최적화되어 있습니다.

대상 성능 테스트

대상에 데이터를 저장하는 데 예상보다 더 많은 시간이 소요될 수 있습니다. 대상에서 데이터를 충분히 빠르게 처리할 수 없기 때문에 속도가 느려지는지 여부를 식별하려면 일시적으로 대상을 행 개수 변환으로 바꿀 수 있습니다. 처리량이 크게 향상되면 데이터를 로드하는 대상에서 속도 저하가 일어난 것입니다.

진행률 탭의 정보 검토

SSIS 디자이너는 SSDT(SQL Server Data Tools) 에서 패키지를 실행할 때 제어 흐름과 데이터 흐름 모두에 대한 정보를 제공합니다. 진행률 탭은 실행 순서대로 작업 및 컨테이너를 나열하고 패키지 자체를 포함하여 각 작업 및 컨테이너에 대한 시작 및 완료 시간, 경고 및 오류 메시지를 포함합니다. 또한 실행 순서대로 데이터 흐름 구성 요소를 나열하고 완료율로 표시되는 진행률 및 처리된 행 수에 대한 정보를 포함합니다.

진행률 탭에 메시지를 표시할지 여부는 SSIS 메뉴의 디버그 진행률 보고 옵션을 선택 또는 선택 취소하여 설정합니다. 진행률 보고를 사용하지 않도록 설정하면 SQL Server Data Tools에서 복잡한 패키지를 실행하는 동안 성능을 향상시킬 수 있습니다.

기사와 블로그 게시물

비디오

참고 항목

패키지 개발 문제 해결 도구
패키지 실행 문제 해결 도구