2017-03-08 8 views
2

나는 SQL Server 2016을 사용하며 매우 바빠서 DataFlow task입니다. 내 DataFlow task에서 어떤 이유로 Multicast component을 사용합니다. DataFlow에 새 Flow를 작성한 후에는 새로운 플로우의 일부 컬럼을 삭제해야합니다.SSIS에서 DataFlow Task의 열을 삭제하려면 어떻게해야합니까?

enter image description here

그냥 자세한 내용은, 내가 할 필요가 내 흐름에서 200 개 이상의 열이 나는 그 컬럼의 10을 필요로하기 때문이다.

DataFlow Task의 열을 SSIS에서 어떻게 삭제할 수 있습니까?

+0

코드를 정리하거나 성능을 향상시키는 것이 목표입니까? –

+0

@ MarkWojciechowicz : 둘 다 내 목표입니다. –

답변

1

당신 추가 할 수 있습니다 추가 구성 요소를 선택하는 것이 좋다. 그러나 이는 결코 복잡성을 줄이거 나 성능을 향상시키지 않습니다. 논리적으로 생각해 보면 인터페이스를 추가해야합니다. 성능면에서는 열을 제거하는 모든 것이 하나의 버퍼에서 다른 모든 버퍼로 한 행 집합을 복사하는 것을 의미합니다. 이를 비동기 변환이라고하며, herehere으로 설명하는 것이 좋습니다.행을 복사하는 것이 제자리에서 업데이트하는 것보다 효율적이지 않다고 생각할 수 있습니다.

  • 소스에 열을 감소 : 여기

    , 차례로, 성능이 향상됩니다 복잡성을 줄이기위한 몇 가지 권장 사항입니다.
    이 연속적으로 사용되지 않는 열을 선택한 경우 쿼리 에서 제거하거나 원본 구성 요소의 선택을 취소하십시오. 이런 식으로 열을 제거하면 메모리에서 차지하는 버퍼에서 제거됩니다.
  • 데이터 흐름의 구성 요소 수를 줄입니다.. 매우 긴 데이터 흐름은 생성하기 쉽고 테스트 할 고통은 유지하기가 더 어렵습니다. 데이터 흐름은 작업 단위 인을 기다리고 있습니다. 중간에 몇 가지가있는 여기에서부터 여기까지의 데이터 스트림입니다. 실제로 데이터 흐름이 빛나는 곳입니다. 메모리 제한과 최대 스레드 수의 복잡성으로부터 스스로를 보호합니다. 작업을 별도의 데이터 흐름이나 저장된 procs로 나누는 것이 좋습니다. 예를 들어 멀티 캐스트를 사용하는 대신 테이블에 데이터를 저장하고 두 번 읽을 수 있습니다.
  • 데이터베이스를 사용하십시오. SSIS는 데이터 이동 도구만큼이나 오케스트레이션 도구입니다. 나는 종종 데이터를 단계로 저장하고, 을 저장 프로 시저로 호출하여 데이터을 처리하는 간단한 데이터 흐름을 사용하면 항상 올인원 데이터 흐름을 능가하는 것으로 나타났습니다.
  • 데이터를 쓰는 횟수를 늘리십시오.. 이는 직관에 반하는 것이지만 작은 데이터 집합으로 데이터를 처리하면 실행 속도가 빠르고 테스트하기 쉽습니다. 깨끗한 슬레이트가 주어지면 소스에서 스테이징 테이블로 데이터를 쓰고, 스테이지 테이블에서 다른 테이블로 클린징 단계를 수행하고, 선택적으로 다른 소스의 데이터를 다른 테이블로 결합하기위한 준수 단계를 추가하는 ETL을 디자인 할 것입니다. 마지막으로 목표 테이블을로드하는 마지막 단계입니다. 각 소스는 자체 목표 테이블로 푸시되고 나중에 데이터베이스를 활용하여 결합됩니다. 첫 번째 단계와 마지막 단계는 빠르게 실행되고 양쪽 끝에서 잠금 또는 차단이 발생하지 않도록 설정됩니다.
  • 벌크로드. 이전 단계는 실제로 대량로드가 발생했음을 보장 할 때 잘 수행됩니다. 이것은 까다로운 일일 수 있지만 일반적으로 OLEDB 대상에서 "빠른로드"를 사용하고 이 아닌으로 oledb 명령을 사용하여 얻을 수 있습니다. 인덱스를 제거하고 다시 추가하는 것은 (몇 가지 예외를 제외하고) 제자리에로드하는 것보다 빠릅니다.

이 가이드 라인을 사용하면 일반적인 방향으로 나아갈 수 있지만 구체적인 성능 문제를 해결하기위한 추가 질문이 게시됩니다.

+0

당신은 "당신은 데이터를 테이블로 옮겨서 멀티 캐스트를 사용하지 않고 두 번 읽을 수 있습니다"라고 말했습니다. 정말로 모든 행을 무대 테이블에 삽입하고 다른 데이터 흐름에서 다시 읽는 것이 훨씬 효율적입니다. 많은 열이있는 하나의 긴 데이터 흐름보다 효율적입니까? 또는 전체 버퍼를 하드 디스크에 삽입하지 않고 한 번에 하나의 데이터 흐름으로 다른 버퍼 전체에 하나의 행 집합을 복사하고 두 번째 시간에 일부 필드를 읽는 것이 더 좋지 않습니까? –

+1

모든 것은 대소 문자가 다르지만, 블라인드 베팅을 부탁하면 데이터베이스에 데이터를 쓰게됩니다. 작은 작업 단위로 생각하십시오. 테스트 및 유지 관리가 쉬우 며 일반적으로 더 잘 수행됩니다. 이는 데이터베이스를 잘 활용하고 더 나은 성능의 병렬 작업 흐름을 생성 할 수 있기 때문에 데이터베이스를 활용할 수있는 경우가 많습니다 –

1

단일 데이터 흐름에서 열을 제거하기 위해 UNION ALL 작업에 하나의 데이터 흐름 경로 만 전달할 수 있다고 생각합니다.

열을 제거하려는 단일 데이터 흐름 경로를 사용하여 Union All 작업으로 전달하십시오. 그런 다음 Union All 작업을 열어 해당 경로에서 제거 할 열을 마우스 오른쪽 단추로 클릭하고 삭제를 선택하십시오.

일반적으로 데이터 소스가 원하지 않는 열을 보내지 않도록 변경해야한다고 생각하지만 특별한 경우입니다. 하나의 경로는 소스에서 모든 열을 필요로하는 멀티 캐스트에서 하나의 경로로. 데이터 소스에서로드되어 있기 때문에 그런 The component that will reduce the column numberMulticast를 사용하는 경우 모든

1

첫째, 내가

당신이 여러 방법으로 작업을 수행 할 수 있습니다 ... 다음 곱한 당신이 요구하는 것은 더 나은 성능을 제공합니다 생각하지 않습니다 :

  1. 당신이 감소 열 소스와 다른 DataFlow Task을 만들 수 있다면는 (예는 : 특정 열 OLEDB 명령)

    을 더
  2. 당신은 (아래 그림처럼) 비동기 출력 으로Script component를 추가하는 Vb.net 또는 C# 스크립트를 사용하여 매핑 출력이 같은 뭔가 점은 지정된 열을 추가 할 수 있습니다

    Output0Buffer.AddRow() 
    Output0Budder.OutColumn = Row.inColumn 
    

enter image description here

  • UNION ALL 구성 요소를 추가
      당신은을 필요로하는 열을 선택3210

    사이드 참고 : 그것은 각 시나리오의 성능을 테스트하고 어떤 종류의 더 나은