실행 계획 및 버퍼 할당Execution Plan and Buffer Allocation

실행 전에 데이터 흐름 태스크에서는 구성 요소를 검사하고 각 구성 요소 시퀀스에 대한 실행 계획을 생성합니다.Before execution, the data flow task examines its components and generates an execution plan for each sequence of components. 이 섹션에서는 실행 계획, 실행 계획을 보는 방법 및 실행 계획에 따라 입력 및 출력 버퍼가 할당되는 방식에 대해 자세히 설명합니다.This section provides details about the execution plan, how to view the plan, and how input and output buffers are allocated based on the execution plan.

실행 계획 이해Understanding the Execution Plan

실행 계획에는 원본 스레드와 작업 스레드가 포함되며 각 스레드에는 원본 스레드에 대한 출력 작업 목록이나 작업 스레드에 대한 입력 및 출력 작업 목록이 포함됩니다.An execution plan contains source threads and work threads, and each thread contains work lists that specify output work lists for source threads or input and output work lists for work threads. 실행 계획의 원본 스레드 데이터 흐름에서 원본 구성 요소를 나타내고 하 여 실행 계획에서 확인 SourceThreadn여기서 n 소스 스레드 수가 0부터 시작 합니다.The source threads in an execution plan represent the source components in the data flow and are identified in the execution plan by SourceThreadn, where n is the zero-based number of the source thread.

각 원본 스레드에서는 버퍼를 만들고, 수신기를 설정하고, 원본 구성 요소에 대해 PrimeOutput 메서드를 호출합니다.Each source thread creates a buffer, sets a listener, and calls the PrimeOutput method on the source component. 이 지점에서 원본 구성 요소는 데이터 흐름 태스크에서 해당 구성 요소에 제공한 출력 버퍼에 행을 추가하기 시작하므로 이 지점이 실행이 시작되고 데이터가 시작되는 지점입니다.This is where execution starts and data originates, as the source component starts adding rows to the output buffers that are provided to it by the data flow task. 원본 스레드가 실행된 후 잔여 작업은 여러 작업 스레드 간에 분산됩니다.After the source threads are running, the balance of work is distributed among work threads.

작업 스레드 입력 및 출력 작업 목록 모두 포함 하 고 실행 계획으로 식별 되 WorkThreadn여기서 n 0부터 시작 스레드에 있는 작업 수입니다.A work thread may contain both input and output work lists and is identified in the execution plan as WorkThreadn, where n is the zero-based number of the work thread. 그래프에 비동기 출력을 사용하는 구성 요소가 포함된 경우 이러한 스레드에는 출력 작업 목록이 포함됩니다.These threads contain output work lists when the graph contains a component with asynchronous outputs.

다음 예제 실행 계획이 나타내는 데이터 흐름에서는 원본 구성 요소가 비동기 출력을 사용하는 변환에 연결되어 있고 이 변환은 대상 구성 요소에 연결되어 있습니다.The following sample execution plan represents a data flow that contains a source component connected to a transformation with an asynchronous output connected to a destination component. 이 예에서 변환 구성 요소에는 비동기 출력이 있으므로 WorkThread0에는 출력 작업 목록이 포함됩니다.In this example, WorkThread0 contains an output work list because the transformation component has an asynchronous output.

SourceThread0   
    Influences: 72 158   
    Output Work List   
        CreatePrimeBuffer of type 1 for output id 10   
        SetBufferListener: "WorkThread0" for input ID 73   
        CallPrimeOutput on component "OLE DB Source" (1)   
    End Output Work List   
    This thread drives 0 distributors   
End SourceThread0   
WorkThread0   
    Influences: 72 158   
    Input Work list, input ID 73   
        CallProcessInput on input ID 73 on component "Sort" (72) for view type 2   
    End Input Work list for input 73   
    Output Work List   
        CreatePrimeBuffer of type 3 for output id 74   
        SetBufferListener: "WorkThread1" for input ID 171with internal handoff   
        CallPrimeOutput on component "Sort" (72)   
    End Output Work List   
    This thread drives 0 distributors   
End WorkThread0   
WorkThread1   
    Influences: 158   
    Input Work list, input ID 171  
        CallProcessInput on input ID 171 on component "OLE DB Destination" (158) for view type 4  
    End Input Work list for input 171   
    Output Work List   
    End Output Work List   
    This thread drives 0 distributors   
End WorkThread1  

참고

실행 계획이 생성 될 때마다 패키지 실행 되 고 로그 공급자를 선택 하 고 로깅을 사용 하도록 설정 하 고 패키지를 추가 하 여 캡처할 수 있습니다는 PipelineExecutionPlan 이벤트입니다.The execution plan is generated every time a package is executed, and can be captured by adding a log provider to the package, enabling logging, and selecting the PipelineExecutionPlan event.

버퍼 할당 이해Understanding Buffer Allocation

실행 계획에 따라 데이터 흐름 태스크에서는 데이터 흐름 구성 요소의 출력에 정의된 열을 포함하는 버퍼를 만듭니다.Based on the execution plan, the data flow task creates buffers that contain the columns defined in the outputs of the data flow components. 이 버퍼는 비동기 출력을 사용하는 구성 요소가 나타날 때까지 구성 요소의 시퀀스를 통해 데이터 흐름으로 재사용됩니다.The buffer is reused as the data flows through the sequence of components, until a component with asynchronous outputs is encountered. 그런 다음 비동기 출력의 출력 열과 다운 스트림 구성 요소의 출력 열을 포함하는 새 버퍼가 만들어집니다.Then, a new buffer is created, which contains the output columns of the asynchronous output and the output columns of downstream components.

실행 중 구성 요소에서는 현재 원본 또는 작업 스레드의 버퍼에 액세스할 수 있습니다.During execution, components have access to the buffer in the current source or work thread. 이 버퍼는 ProcessInput 메서드에 의해 제공된 입력 버퍼이거나 PrimeOutput 메서드에 의해 제공된 출력 버퍼입니다.The buffer is either an input buffer, provided by the ProcessInput method, or an output buffer, provided by the PrimeOutput method. ModePipelineBuffer 속성도 각 버퍼를 입력 또는 출력 버퍼로 식별합니다.The Mode property of the PipelineBuffer also identifies each buffer as an input or output buffer.

비동기 출력을 사용하는 변환은 ProcessInput 메서드에서 기존 입력 버퍼를 받고 PrimeOutput 메서드에서 새 출력 버퍼를 받습니다.Transformation components with asynchronous outputs receive the existing input buffer from the ProcessInput method, and receive the new output buffer from the PrimeOutput method. 비동기 출력을 사용하는 구성 요소는 데이터 흐름에서 입력 버퍼와 출력 버퍼를 모두 받는 유일한 유형의 구성 요소입니다.A transformation component with asynchronous outputs is the only type of data flow component that receives both an input and an output buffer.

구성 요소에 제공 된 버퍼가 포함 될 가능성이 있기 때문에 해당 입력 또는 출력 열 컬렉션에 구성 요소 보다 더 많은 열에, 구성 요소 개발자가 호출할 수는 FindColumnByLineageID 지정 하 여 버퍼에서 열을 찾을 방법의 LineageID합니다.Because the buffer provided to a component is likely to contain more columns than the component has in its input or output column collections, component developers can call the FindColumnByLineageID method to locate a column in the buffer by specifying its LineageID.