План выполнения и выделение буферов
Область применения: среда выполнения интеграции SSIS SQL Server в Фабрика данных Azure
Перед выполнением задача потока данных проверяет свои компоненты и формирует план выполнения для каждой последовательности компонентов. В этом разделе предоставляются сведения о плане выполнения, рассматривается, как просмотреть план и как на основании плана выполнения выделяются входной и выходной буферы.
Основные сведения о плане выполнения
План выполнения содержит потоки источника и рабочие потоки. Каждый поток содержит списки действий, которые задают списки действий над выходными данными для потоков источника или списки действий над входными и выходными данными для рабочих потоков. Потоки источника в плане выполнения представляют компоненты источника в потоке данных и идентифицируются в плане выполнения как SourceThreadn, где n — это начинающееся с нуля число потоков источника.
Каждый поток источника создает буфер, устанавливает прослушивателя и вызывает метод PrimeOutput на компоненте источника. Здесь начинается выполнение и отсюда берутся данные, когда компонент источника начинает добавлять строки в выходные буферы, предоставляемые ему задачей потока данных. После начала работы потоков источника работа распределяется среди рабочих потоков.
Рабочий поток содержит списки действий как над входными, так и над выходными данными и идентифицируется в плане выполнения как WorkThreadn, где n — это начинающееся с нуля число рабочих потоков. Эти потоки содержат списки действий над выходными данными, если граф содержит компонент с асинхронными выходами.
Следующий образец плана выполнения представляет поток данных, который содержит компонент источника, подключенный к преобразованию с асинхронным выходом, подключенным к компоненту назначения. В этом примере WorkThread0 содержит список действий над выходными данными, поскольку компонент преобразования имеет асинхронный выход.
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.
Основные сведения о выделении буферов
На основании плана выполнения задача потока данных создает буферы, содержащие столбцы, определенные в выходах компонентов потока данных. Буфер повторно используется как потоки данных через последовательность компонентов, пока не встретится компонент с асинхронными выходами. После этого создается новый буфер, который содержит выходные столбцы асинхронного выхода и выходные столбцы компонентов нисходящего потока.
Во время выполнения компоненты имеют доступ к буферу в текущем источнике рабочего потока. Буфер является либо входным буфером, предоставляемым методом ProcessInput, либо выходным буфером, предоставляемым методом PrimeOutput. Свойство Mode буфера PipelineBuffer также идентифицирует каждый буфер как входной или выходной буфер.
Компоненты преобразования с асинхронными выходами получают существующий входной буфер от метода ProcessInput и получают новый выходной буфер от метода PrimeOutput. Компонент преобразования с асинхронными выходами является единственным типом компонентов потока данных, который получает и входной, и выходной буфера.
Поскольку буфер, предоставленный компоненту, скорее всего, содержит больше столбцов, чем имеет компонент в его коллекциях входных и выходных столбцов, разработчики компонентов могут вызывать метод FindColumnByLineageID, чтобы определить положение столбца в буфере по его идентификатору LineageID.