Plano de execução e alocação de buffer
Antes da execução, a tarefa de fluxo de dados examina seus componentes e gera um plano de execução para cada sequência de componentes. Essa seção fornece detalhes sobre o plano de execução, como visualizá-lo e como buffers de entrada e saída são alocados com base no plano de execução.
Compreendendo o plano de execução
Um plano de execução contém threads de origem e threads de trabalho, e cada thread contém listas de trabalho que especificam listas de trabalho de saída para threads de origem ou listas de trabalho de entrada e saída para threads de trabalho. Os threads de origem em um plano de execução representam os componentes de origem no fluxo de dados e são identificados no plano de execução por SourceThreadn, onde n é o número com base em zero do thread de origem.
Cada thread de origem cria um buffer, define um ouvinte e chama o método PrimeOutput no componente de origem. É nesse ponto que a execução é iniciada e dados são gerados, pois o componente de origem começa a adicionar linhas aos buffers de saída fornecidos pela tarefa de fluxo de dados. Depois do início da execução dos threads de origem, o balanço do trabalho é distribuído entre os threads de trabalho.
Um thread de trabalho pode conter listas de trabalho de entrada e saída e é identificado no plano de execução como WorkThreadn, onde n é o número com base em zero do thread de trabalho. Esses threads contêm listas de trabalho de saída quando o gráfico contém um componente com saídas assíncronas.
O exemplo de plano de execução a seguir representa um fluxo de dados que contém um componente de origem conectado a uma transformação com uma saída assíncrona conectada a um componente de destino. Nesse exemplo, o WorkThread0 contém uma lista de trabalho de saída porque o componente de transformação possui uma saída assíncrona.
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
Observação |
---|
O plano de execução é gerado toda vez que um pacote é executado. Para capturá-lo, adicione um provedor de log ao pacote, habilite o registro em log e selecione o evento PipelineExecutionPlan. |
Compreendendo a alocação de buffers
Com base no plano de execução, a tarefa de fluxo de dados cria buffers contendo as colunas definidas nas saídas dos componentes de fluxo de dados. O buffer é reutilizado como os fluxos de dados pela sequência de componentes, até ser encontrado um componente com saídas assíncronas. Portanto, é criado um buffer novo, que contém as colunas de saída da saída assíncrona e as colunas de saída de componentes downstream.
Durante a execução, componentes têm acesso ao buffer na origem atual ou thread de trabalho. O buffer é de entrada, fornecido pelo método ProcessInput, ou de saída, fornecido pelo método PrimeOutput. A propriedade Mode do PipelineBuffer também identifica cada buffer como um buffer de entrada ou de saída.
Os componentes de transformação com saídas assíncronas recebem o buffer de entrada existente do método ProcessInput e recebem o novo buffer de saída do método PrimeOutput. Um componente de transformação com saídas assíncronas é o único tipo de componente de fluxo de dados que recebe um buffer de entrada e saída.
Como é provável que o buffer fornecido a um componente contenha mais colunas do que o componente possui em suas coleções de colunas de entrada ou saída, desenvolvedores de componentes podem chamar o método FindColumnByLineageID para localizar uma coluna no buffer, especificando seu LineageID.
|