Стек преобразований поиска SSIS - PullRequest
0 голосов
/ 08 июля 2011

У меня есть задача потока данных в SSIS 2008, которая извлекает около 2 000 000 строк с источником OLE DB, а затем выполняет преобразования поиска один за другим через 24, заменяя данные «кода» либо их предварительно определенным эквивалентом из таблицы измерений. или «неизвестное» значение.

Этот процесс один за другим, когда весь поток, проходящий через каждое преобразование, стал основным узким местом в выполнении пакета, и мне нужен способ ускорить процесс. Есть идеи?

Я пытался многоадресно передать набор данных для каждого из 24 различных поисков (так, чтобы ему отправлялся только необходимый столбец), но когда я затем запускаю их все в объединение, все задачи кажутся не похожими на различные Типы данных и склонны выдавать ошибки независимо от того, как я это настраиваю. Есть ли другой вариант, который я пропускаю?

Ответы [ 2 ]

2 голосов
/ 11 июля 2011

Я бы сделал все это на чистом TSQL: вставьте 2 миллиона строк в промежуточную таблицу и используйте операторы UPDATE, чтобы установить нужные значения.Это почти наверняка будет намного быстрее, чем процесс построчного поиска, и вы также можете при необходимости поместить индексы в промежуточную таблицу.

После обновления данных вы можете отправить их к месту назначениятаблицы в другом потоке данных или, если промежуточные и конечные таблицы находятся на одном сервере, просто используйте INSERT ... SELECT ..., чтобы сделать это.

Лично я всегда избегаю преобразований SSIS, если есть простой способ сделать это вTSQL;производительность лучше, и я считаю, что код TSQL легче поддерживать, чем пакеты служб SSIS.Сказав это, SSIS является отличным инструментом управления потоком данных для получения данных из разных мест, доставки их в промежуточную базу данных, где вы можете работать с ней, и выполнения процедур или сценариев для преобразования данных.

0 голосов
/ 12 июля 2011

Возможно, что узкое место может , а не быть там, где вы думаете, что оно есть.Это может быть целевой компонент, который может снизить производительность пакета.Преобразования пакета ожидают, пока данные пакета не будут вставлены в место назначения.Это заставляет нас верить, что преобразования, которые появляются в желтом цвете, выполняются медленно.На самом деле задачи преобразования поиска выполняются очень быстро, насколько я видел в своем опыте.

Следующий пример читает 1 миллион строк из источника плоских файлов и вставляет их в SQL Server.Несмотря на то, что он использует только один поиск, причина, по которой я привел здесь пример, состоит в том, чтобы дать вам представление о наличии нескольких компонентов назначения.Наличие нескольких пунктов назначения для приема данных, обработанных различными преобразованиями, ускорит пакет.

Надеюсь, этот пример даст вам представление о том, как вы можете улучшить производительность вашего пакета.

Пошаговый процесс:

  1. В базе данных SQL Server создайте две таблицы, а именно dbo.ItemInfo и dbo.Staging.Запросы на создание таблиц доступны в разделе Scripts .Структура этих таблиц показана на скриншоте # 1 .ItemInfo будет содержать фактические данные, а таблица Staging будет содержать промежуточные данные для сравнения и обновления фактических записей.Столбец Id в обеих этих таблицах представляет собой автоматически генерируемый столбец уникальных идентификаторов.Столбец IsProcessed в таблице ItemInfo будет использоваться для идентификации и удаления недействительных записей.

  2. Создайте пакет служб SSIS и создайте 5 переменных, как показано на скриншоте # 2 .Я использовал расширение .txt для файлов с разделителями табуляции и, следовательно, значение *.txt в переменной FileExtension .Переменной FilePath будет присвоено значение во время выполнения.FolderLocation переменная указывает, где файлы будут расположены.Переменные SQLPostLoad и SQLPreLoad обозначают хранимые процедуры, используемые во время операций до и после загрузки.Сценарии для этих хранимых процедур предоставляются в разделе Сценарии .

  3. Создание подключения OLE DB, указывающего на базу данных SQL Server.Создайте соединение с плоским файлом, как показано на скриншотах # 3 и # 4 . Столбцы подключения к плоскому файлу * В разделе 1052 * содержится информация об уровне столбца.Снимок экрана # 5 показывает предварительный просмотр данных столбцов.

  4. Настройте задачу потока управления, как показано на скриншоте # 6 .Настройте задачи Pre Load, Post Load и Loop Files, как показано на снимках экрана # 7 - # 10 .Предварительная загрузка усекает промежуточную таблицу и устанавливает флаг IsProcessed в значение false для всех строк в таблице ItemInfo.Post Load обновит изменения и удалит строки в базе данных, которые не найдены в файле.Обратитесь к хранимым процедурам, используемым в этих задачах, чтобы понять, что делается в этих Execute SQL задачах.

  5. Дважды щелкните задачу потока данных Load Items и настройте ее, как показано на скриншоте# 11 .Read File - источник плоских файлов, настроенный для использования соединения с плоскими файлами.Row Count является производным преобразованием столбца, и его конфигурация показана на экране # 12 .Check Exist - это преобразование поиска, и его конфигурации показаны на скриншотах # 13 - # 15 . Lookup No Match Output перенаправляется на Destination Split на левой стороне. Вывод соответствия поиска перенаправляется на Staging Split на левой стороне.Destination Split и Staging Split имеют точно такую ​​же конфигурацию, как показано на скриншоте # 16 .Причиной для 9 различных назначений для таблицы назначения и промежуточной таблицы является повышение производительности пакета.

  6. Все целевые задачи 0 - 8 настроены на вставку данных в таблицу dbo.ItemInfoкак показано на скриншоте # 17 .Все промежуточные задания 0 - 8 настроены на вставку данных в dbo.Staging, как показано на скриншоте # 18 .

  7. В диспетчере соединений с плоскими файлами установите свойство ConnectionString, чтобы использовать переменную FilePath, как показано на снимке экрана # 19 . Это позволит пакету использовать значение, установленное в переменной, при циклическом просмотре каждого файла в папке.

Тестовые сценарии:

Test results may vary from machine to machine. 
In this scenario, file was located locally on the machine. 
Files on network might perform slower. 
This is provided just to give you an idea. 
So, please take these results with grain of salt.
  1. Пакет был выполнен на 64-битной машине с одноядерным процессором Xeon 2,5 ГГц и 3,00 ГБ ОЗУ.

  2. Загружен плоский файл с 1 million rows. Пакет выполняется примерно за 2 минуты 47 секунд . Смотрите скриншоты # 20 и # 21 .

  3. Использовал запросы, представленные в разделе Тестовые запросы , чтобы изменить данные для имитации обновления, удаления и создания новых записей во время второго запуска пакета.

  4. Загружен тот же файл, содержащий 1 million rows после выполнения следующих запросов в базе данных. Пакет исполняется примерно за 1 мин 35 с . Смотрите скриншоты # 22 * ​​1146 * и # 23 . Обратите внимание на количество строк, перенаправленных на место назначения и промежуточную таблицу на скриншоте # 22 * ​​1150 *.

Надеюсь, это поможет.

Тестовые запросы: .

--These records will be deleted during next run 
--because item ids won't match with file data.
--(111111 row(s) affected)
UPDATE dbo.ItemInfo SET ItemId = 'DEL_' + ItemId WHERE Id % 9 IN (3)

--These records will be modified to their original item type of 'General'
--because that is the data present in the file.
--(222222 row(s) affected)
UPDATE dbo.ItemInfo SET ItemType = 'Testing' + ItemId WHERE Id % 9 IN (2,6)

--These records will be reloaded into the table from the file.
--(111111 row(s) affected)
DELETE FROM dbo.ItemInfo WHERE Id % 9 IN (5,9)

Столбцы подключения плоских файлов .

Name        InputColumnWidth     DataType          OutputColumnWidth
----------  ----------------     ---------------   -----------------
Id          8                    string [DT_STR]   8
ItemId      11                   string [DT_STR]   11
ItemName    21                   string [DT_STR]   21
ItemType    9                    string [DT_STR]   9

Сценарии: (для создания таблиц и хранимых процедур) .

CREATE TABLE [dbo].[ItemInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    [IsProcessed] [bit] NULL,
    CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Staging](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
 CONSTRAINT [PK_Staging] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE PROCEDURE [dbo].[PostLoad]
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE      ITM
    SET         ITM.ItemName    = STG.ItemName
            ,   ITM.ItemType    = STG.ItemType 
            ,   ITM.IsProcessed = 1
    FROM        dbo.ItemInfo    ITM
    INNER JOIN  dbo.Staging     STG
    ON          ITM.ItemId      = STG.ItemId;

    DELETE FROM dbo.ItemInfo
    WHERE       IsProcessed = 0;
END
GO

CREATE PROCEDURE [dbo].[PreLoad]
AS
BEGIN
    SET NOCOUNT ON;

    TRUNCATE TABLE dbo.Staging;     

    UPDATE  dbo.ItemInfo 
    SET     IsProcessed = 0;
END
GO

Скриншот №1:

1

Скриншот №2:

2

Скриншот № 3:

3

Снимок экрана № 4:

4

Снимок экрана № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Скриншот № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Снимок экрана № 14:

14

Скриншот № 15:

15

Снимок экрана № 16:

16

Снимок экрана № 17:

17

Снимок экрана № 18:

18

Снимок экрана № 19:

19

Снимок экрана № 20:

20

Снимок экрана № 21:

21

Снимок экрана № 22:

22

Скриншот № 23:

23

...