Piano di esecuzione e allocazione di buffer
Prima dell'esecuzione, l'attività Flusso di dati esamina i propri componenti e genera un piano di esecuzione per ogni sequenza di componenti. 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.
Informazioni sul piano di esecuzione
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. I thread di origine in un piano di esecuzione rappresentano i componenti di origine nel flusso di dati e sono identificati da SourceThreadn, dove n è il numero in base zero del thread di origine.
Ogni thread di origine crea un buffer, imposta un listener e chiama il metodo PrimeOutput sul componente di origine. 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. Dopo l'inizio dell'esecuzione dei thread di origine, il lavoro viene bilanciato tra thread di lavoro.
Un thread di lavoro può contenere sia elenchi di operazioni di input che di output ed è identificato nel piano di esecuzione come WorkThreadn, n è il numero in base zero del thread di lavoro. Questi thread contengono elenchi di operazioni di output quando il grafico contiene un componente con output asincroni.
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. Nell'esempio WorkThread0 contiene un elenco di operazioni di output perché il componente di trasformazione ha un output asincrono.
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 un pacchetto viene eseguito e può essere acquisito con l'aggiunta di un provider di log al pacchetto, l'abilitazione della registrazione e la selezione dell'evento PipelineExecutionPlan.
Informazioni sull'allocazione di buffer
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. Il buffer viene riutilizzato durante il flusso dei dati attraverso la sequenza dei componenti, finché non viene rilevato un componente con output asincroni. 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.
Durante l'esecuzione, i componenti hanno accesso al buffer nell'origine o nel thread di lavoro corrente. Il buffer è un buffer di input, fornito dal metodo ProcessInput, o un buffer di output, fornito dal metodo PrimeOutput. Anche la proprietà Mode di PipelineBuffer identifica ogni buffer come buffer di input o di output.
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. 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.
Poiché il buffer fornito a un componente contiene probabilmente più colonne di quelle presenti nelle raccolte di colonne di output o di input del componente, gli sviluppatori di componenti possono chiamare il metodo FindColumnByLineageID per individuare una colonna nel buffer specificando LineageID.
|