Возможно, что узкое место может , а не быть там, где вы думаете, что оно есть.Это может быть целевой компонент, который может снизить производительность пакета.Преобразования пакета ожидают, пока данные пакета не будут вставлены в место назначения.Это заставляет нас верить, что преобразования, которые появляются в желтом цвете, выполняются медленно.На самом деле задачи преобразования поиска выполняются очень быстро, насколько я видел в своем опыте.
Следующий пример читает 1 миллион строк из источника плоских файлов и вставляет их в SQL Server.Несмотря на то, что он использует только один поиск, причина, по которой я привел здесь пример, состоит в том, чтобы дать вам представление о наличии нескольких компонентов назначения.Наличие нескольких пунктов назначения для приема данных, обработанных различными преобразованиями, ускорит пакет.
Надеюсь, этот пример даст вам представление о том, как вы можете улучшить производительность вашего пакета.
Пошаговый процесс:
В базе данных SQL Server создайте две таблицы, а именно dbo.ItemInfo
и dbo.Staging
.Запросы на создание таблиц доступны в разделе Scripts .Структура этих таблиц показана на скриншоте # 1 .ItemInfo
будет содержать фактические данные, а таблица Staging
будет содержать промежуточные данные для сравнения и обновления фактических записей.Столбец Id
в обеих этих таблицах представляет собой автоматически генерируемый столбец уникальных идентификаторов.Столбец IsProcessed
в таблице ItemInfo будет использоваться для идентификации и удаления недействительных записей.
Создайте пакет служб SSIS и создайте 5 переменных, как показано на скриншоте # 2 .Я использовал расширение .txt
для файлов с разделителями табуляции и, следовательно, значение *.txt
в переменной FileExtension .Переменной FilePath
будет присвоено значение во время выполнения.FolderLocation
переменная указывает, где файлы будут расположены.Переменные SQLPostLoad
и SQLPreLoad
обозначают хранимые процедуры, используемые во время операций до и после загрузки.Сценарии для этих хранимых процедур предоставляются в разделе Сценарии .
Создание подключения OLE DB, указывающего на базу данных SQL Server.Создайте соединение с плоским файлом, как показано на скриншотах # 3 и # 4 . Столбцы подключения к плоскому файлу * В разделе 1052 * содержится информация об уровне столбца.Снимок экрана # 5 показывает предварительный просмотр данных столбцов.
Настройте задачу потока управления, как показано на скриншоте # 6 .Настройте задачи Pre Load
, Post Load
и Loop Files
, как показано на снимках экрана # 7 - # 10 .Предварительная загрузка усекает промежуточную таблицу и устанавливает флаг IsProcessed
в значение false для всех строк в таблице ItemInfo.Post Load обновит изменения и удалит строки в базе данных, которые не найдены в файле.Обратитесь к хранимым процедурам, используемым в этих задачах, чтобы понять, что делается в этих Execute SQL
задачах.
Дважды щелкните задачу потока данных 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 различных назначений для таблицы назначения и промежуточной таблицы является повышение производительности пакета.
Все целевые задачи 0 - 8 настроены на вставку данных в таблицу dbo.ItemInfo
как показано на скриншоте # 17 .Все промежуточные задания 0 - 8 настроены на вставку данных в dbo.Staging
, как показано на скриншоте # 18 .
В диспетчере соединений с плоскими файлами установите свойство 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.
Пакет был выполнен на 64-битной машине с одноядерным процессором Xeon 2,5 ГГц и 3,00 ГБ ОЗУ.
Загружен плоский файл с 1 million rows
. Пакет выполняется примерно за 2 минуты 47 секунд . Смотрите скриншоты # 20 и # 21 .
Использовал запросы, представленные в разделе Тестовые запросы , чтобы изменить данные для имитации обновления, удаления и создания новых записей во время второго запуска пакета.
Загружен тот же файл, содержащий 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](https://i.stack.imgur.com/7v06Z.png)
Скриншот №2:
![2](https://i.stack.imgur.com/fkyyG.png)
Скриншот № 3:
![3](https://i.stack.imgur.com/IKIBo.png)
Снимок экрана № 4:
![4](https://i.stack.imgur.com/TAirD.png)
Снимок экрана № 5:
![5](https://i.stack.imgur.com/tFndU.png)
Снимок экрана № 6:
![6](https://i.stack.imgur.com/voXpe.png)
Снимок экрана № 7:
![7](https://i.stack.imgur.com/cDIpf.png)
Снимок экрана № 8:
![8](https://i.stack.imgur.com/M3Fqv.png)
Снимок экрана № 9:
![9](https://i.stack.imgur.com/O4qfV.png)
Снимок экрана № 10:
![10](https://i.stack.imgur.com/yE8PP.png)
Скриншот № 11:
![11](https://i.stack.imgur.com/Fx4ST.png)
Снимок экрана № 12:
![12](https://i.stack.imgur.com/b0tT7.png)
Снимок экрана № 13:
![13](https://i.stack.imgur.com/ahrYI.png)
Снимок экрана № 14:
![14](https://i.stack.imgur.com/LSO7P.png)
Скриншот № 15:
![15](https://i.stack.imgur.com/dXPQD.png)
Снимок экрана № 16:
![16](https://i.stack.imgur.com/DoWod.png)
Снимок экрана № 17:
![17](https://i.stack.imgur.com/AqVKk.png)
Снимок экрана № 18:
![18](https://i.stack.imgur.com/oeN9v.png)
Снимок экрана № 19:
![19](https://i.stack.imgur.com/BxsR7.png)
Снимок экрана № 20:
![20](https://i.stack.imgur.com/tU8qT.png)
Снимок экрана № 21:
![21](https://i.stack.imgur.com/r6qLO.png)
Снимок экрана № 22:
![22](https://i.stack.imgur.com/oM5Be.png)
Скриншот № 23:
![23](https://i.stack.imgur.com/zKkPi.png)