Piano di esecuzione e allocazione di bufferExecution Plan and Buffer Allocation

Prima dell'esecuzione, l'attività Flusso di dati esamina i propri componenti e genera un piano di esecuzione per ogni sequenza di componenti.Before execution, the data flow task examines its components and generates an execution plan for each sequence of components. In questa sezione vengono fornite informazioni sul piano di esecuzione, su come visualizzarlo e su come influisce sull'allocazione dei buffer di input e output.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.

Informazioni sul piano di esecuzioneUnderstanding the Execution Plan

Un piano di esecuzione contiene thread di origine e thread di lavoro. Ogni thread contiene elenchi di operazioni che specificano elenchi di operazioni di output per i thread di origine oppure elenchi di operazioni di input e output per i thread di lavoro.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. Il thread di origine in un piano di esecuzione rappresentano i componenti di origine nel flusso di dati e sono identificati nel piano di esecuzione da SourceThreadn, dove n è il numero in base zero del thread di origine.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.

Ogni thread di origine crea un buffer, imposta un listener e chiama il metodo PrimeOutput sul componente di origine.Each source thread creates a buffer, sets a listener, and calls the PrimeOutput method on the source component. Si tratta del punto in cui viene avviata l'esecuzione e hanno origine i dati, quando il componente di origine inizia ad aggiungere righe nei buffer di output forniti dall'attività Flusso di dati.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. Dopo l'inizio dell'esecuzione dei thread di origine, il lavoro viene bilanciato tra thread di lavoro.After the source threads are running, the balance of work is distributed among work threads.

Un thread di lavoro può contenere entrambi gli elenchi di lavoro di input e output ed è identificato nel piano di esecuzione come WorkThreadn, dove n è il numero in base zero del thread di lavoro.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. Questi thread contengono elenchi di operazioni di output quando il grafico contiene un componente con output asincroni.These threads contain output work lists when the graph contains a component with asynchronous outputs.

Nel piano di esecuzione di esempio seguente viene rappresentato un flusso di dati che contiene un componente di origine connesso a una trasformazione con un output asincrono connesso a un componente di destinazione.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. Nell'esempio WorkThread0 contiene un elenco di operazioni di output perché il componente di trasformazione ha un output asincrono.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  

Nota

Il piano di esecuzione viene generato ogni volta che viene eseguito un pacchetto e può essere acquisito mediante l'aggiunta di un provider di log per il pacchetto, l'abilitazione di registrazione e selezionando il PipelineExecutionPlan evento.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.

Informazioni sull'allocazione di bufferUnderstanding Buffer Allocation

In base al piano di esecuzione, l'attività Flusso di dati crea buffer che contengono le colonne definite negli output dei componenti del flusso di dati.Based on the execution plan, the data flow task creates buffers that contain the columns defined in the outputs of the data flow components. Il buffer viene riutilizzato durante il flusso dei dati attraverso la sequenza dei componenti, finché non viene rilevato un componente con output asincroni.The buffer is reused as the data flows through the sequence of components, until a component with asynchronous outputs is encountered. A questo punto viene creato un nuovo buffer, che contiene le colonne di output dell'output asincrono e le colonne di output dei componenti a valle.Then, a new buffer is created, which contains the output columns of the asynchronous output and the output columns of downstream components.

Durante l'esecuzione, i componenti hanno accesso al buffer nell'origine o nel thread di lavoro corrente.During execution, components have access to the buffer in the current source or work thread. Il buffer è un buffer di input, fornito dal metodo ProcessInput, o un buffer di output, fornito dal metodo PrimeOutput.The buffer is either an input buffer, provided by the ProcessInput method, or an output buffer, provided by the PrimeOutput method. Anche la proprietà Mode di PipelineBuffer identifica ogni buffer come buffer di input o di output.The Mode property of the PipelineBuffer also identifies each buffer as an input or output buffer.

I componenti di trasformazione con output asincroni ricevono il buffer di input esistente dal metodo ProcessInput e il nuovo buffer di output dal metodo 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. Un componente di trasformazione con output asincroni è il solo tipo di componente del flusso di dati che riceve un buffer sia di input che di output.A transformation component with asynchronous outputs is the only type of data flow component that receives both an input and an output buffer.

Poiché è probabile che contengono il buffer fornito a un componente dispone di più colonne che il componente nelle relative raccolte di colonne di input o output, gli sviluppatori di componenti è possono chiamare il FindColumnByLineageID metodo per individuare una colonna nel buffer specificando il relativo 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.