Plano de execução e alocação de buffer

Aplica-se a: Tempo de execução de integração do SSIS do SQL Server no Azure Data Factory

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, em que 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, em que 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 logs 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.

Já que é provável que o buffer fornecido a um componente contenha mais colunas do que o componente tem 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.