SQL Server Integration Services как инструмент переноса исторических данных

25 2

Иногда, при внедрении DIRECTUM, возникает задача переноса (миграции) исторических данных из системы, которая использовалась в компании ранее.
На эту тему уже было несколько статей:
Импорт договоров в систему DIRECTUM,
Сценарий Импорт записей справочников из xls-файла
В данной статье я расскажу о том, как можно перенести исторические данные, используя SQL Server Integration Services.

Небольшое введение

Задача переноса данных достаточно трудоёмкая, поэтому, прежде всего, необходимо быть уверенным в том, что эти данные будут нужны и будут использоваться.
Далее необходимо определить список объектов для переноса:

  1. Электронные документы
  2. Записи справочников
  3. ЗЗУ
  4. Пользователи

Выбрать способ переноса:

  1. Объектная модель (ОМ) DIRECTUM
  2. SQL Server Integration Services (SSIS)

Кратко рассмотрим плюсы и минусы данных способов
ОМ DIRECTUM
«+» Простота разработки. (Можно реализовать с помощью прикладных сценариев, веб-сервисов DIRECTUM или написать утилиту на любимом языке…)

«-» Маленькая скорость переноса данных.
«-» Исходная (старая) система должна иметь соответствующие инструменты для экспорта объектов.

SQL Server Integration Services
«+» Большая скорость переноса данных. (За счёт использования BULK-Insert).

 «-» Сложность разработки. (Необходимо «вручную» учитывать все особенности хранения объектов DIRECTUM в БД. В случае использования ОМ, системная логика отрабатывает автоматически.)

Основная часть

Рассмотрим применение SSIS на примере реального проекта.
Нам предстоит перенести исторические данные из СЭД LanDocs в СЭД DIRECTUM и сделать это с помощью инструмента под названием SQL Server Integration Services.

Службы Microsoft Integration Services — это платформа для построения решений по интеграции и преобразованию данных уровня предприятия. Службы Integration Services используются при решении сложных бизнес-задач копирования и загрузки файлов, отправки электронных сообщений в ответ на события, обновления хранилищ данных, очистки и интеллектуального анализа данных, а также управления объектами и данными SQL Server. Службы Integration Services могут извлекать и преобразовывать данные из ряда таких источников, как XML- файлы, неструктурированные файлы и источники реляционных данных.

Возможности SSIS поистине безграничны велики. Подробности можно узнать, например, на MSDN. Мы же воспользуемся только малой частью этих возможностей.

Перед тем как приступить к реализации, необходимо изучить структуры баз данных системы-источника и системы-приёмника. Физическую структуру данных DIRECTUM мы все отлично знаем. А на структуре БД LanDocs подробно останавливаться не будем, всё есть в документации.

LanDocs, как и DIRECTUM, использует СУБД MSSQL.
Развернём копию БД LanDocs, БД DIRECTUM и БД DIR_BUFFER (о ней далее) на одном сервере. Файлы разных БД лучше расположить на разных физических дисках для оптимизации скорости копирования.
Чтобы использовать SSIS, установим всё необходимое на SQL-сервер:

  1. SQL Server Integration Services (компонента SQL).
  2. Business Intelligence Development Studio (компонента SQL).
  3. Visual Studio.

Создадим в Visual Studio проект Integration Services.

Создадим подключения к базам данных.

 


Примечание: практический интерес имеет статья  «Получение и преобразование данных из Firebird и Interbase».

Вот здесь начинается самое интересное. Как можно догадаться, просто так взять и перенести данные «Ctrl+C Ctrl+V» или, точнее сказать, «Select-Insert» не получится.

Остановимся подробнее на стратегии и некоторых особенностях переноса данных.

В базе LanDocs данные хранятся в таблицах, структура которых отличается от структуры DIRECTUM, будут отличаться и идентификаторы (ИД) объектов. Поэтому, потребуется конвертация, как структуры данных, так и ИД.
Общая стратегия переноса данных будет следующая:

  1. Перенести данные из БД LanDocs в БД DIR_BUFFER.
  2. Сконвертировать ИД LanDocs на ИД DIRECTUM в БД DIR_BUFFER.
  3. Перенести данные из БД DIR_BUFFER в БД DIRECTUM.

Шаг 1. Перенос данных из БД LanDocs в БД DIR_BUFFER

В БД DIR_BUFFER необходимо создать почти все таблицы, которые присутствуют в БД DIRECTUM (собственно, таблицы, которые будут заполняться данными из LanDocs + некоторые системные таблицы). Для обеспечения «обратной» связи, в каждую таблицу добавим поле «[LDID] [int] NULL». В этой базе, также, будут размещаться (временные) таблицы, которые потребуются для обеспечения конвертации и переноса данных в соответствии с бизнес логикой.
Пример запроса создания таблицы в БД DIR_BUFFER:

--MBAnalit
IF EXISTS ( SELECT  *
            FROM    sysobjects
            WHERE   id = OBJECT_ID('MBAnalit') )
    DROP TABLE MBAnalit

CREATE TABLE [dbo].[MBAnalit]
    (
      [ID] [int] IDENTITY
                 NOT NULL ,
      [Vid] [int] NULL ,
      [Analit] [int] NULL ,
      [Kod] [char](10) NULL ,
      [NameAn] [varchar](512) NULL ,
      [Sost] [varchar](1) NULL ,
      [HighLvl] [int] NULL ,
      ....
      [LDID] [int] NULL
    )

Список таблиц БД DIR_BUFFER

  • MBAnalit
  • MBAnValR
  • MBAnValR2
  • MBAnValR3
  • MBAnValR4
  • MBAnValR5
  • MBAnValR6
  • MBAnValR7
  • MBAnValR8
  • MBAnValR9
  • MBAnValR10
  • MBAnValR11
  • MBAnValR12
  • MBText
  • SBTaskAcc
  • SBTask
  • SBTaskJob
  • SBTaskRoute
  • SBTaskText
  • XIni
  • MBVidAn
  • SBEDoc
  • MBEDocType
  • SBEDocVer
  • SBEDocAcc
  • V_USERS (необходима для переноса пользователей, подробности далее)
  • V_ORG (необходима для переноса организаций, подробности далее)
  • XProtokol
  • SBEDocProtocol
  • SBLinks
  • SBFullAccessRights
  • SBTaskAttach
  • TaskAcc
  • SBTaskProtocol
  • SBEDocValR4
  • MBUser
  • MBUserLink
  • MBUserComp
  • MBUserCompRec
  • SBFolder
  • SBFolderAcc
  • MBComponent

Примечание: данный список не является жёстким и зависит от многих факторов.

Таблицы промежуточной БД DIR_BUFFER созданы, настало время их заполнить. Для максимального ускорения будем использовать BULK-Insert. Рассмотрим, как он реализуется с помощью SSIS.
Вытащим в область «Control Flow» контрол под названием «Data Flow Task»


 Переименуем и выделим контрол.

Перейдём на вкладку «Data Flow».
 

Здесь нам понадобятся «OLE DB Source» и «OLE DB Destination».
 

Вытащим их в область «Data Flow» и соединим.
 
 

«OLE DB Source» обеспечивает выборку данных. По двойному клику открываются настройки.
Выборка данных происходит из БД LanDocs путём SQL-запроса.
 

Пример запроса (SQL command text):

SELECT CAST(( 'Acts' ) AS VARCHAR) COLLATE SQL_Latin1_General_CP1251_CS_AS AS LDANALIT ,
        CAST('Акт №' + ISNULL(E.DocN, '') + ' от ' + ISNULL(CONVERT(VARCHAR(24), E.RegDate, 104), '') AS VARCHAR(512)) COLLATE SQL_Latin1_General_CP1251_CS_AS AS NameAn ,
        CAST('Д' AS VARCHAR) COLLATE SQL_Latin1_General_CP1251_CS_AS AS Sost ,
        CAST('Н' AS VARCHAR) COLLATE SQL_Latin1_General_CP1251_CS_AS AS IsDouble ,
        CAST('+' AS VARCHAR) COLLATE SQL_Latin1_General_CP1251_CS_AS AS StatFlag ,
        CAST('+' AS VARCHAR) COLLATE SQL_Latin1_General_CP1251_CS_AS AS XRecStat,
        CAST(E.DocN AS VARCHAR) COLLATE SQL_Latin1_General_CP1251_CS_AS AS Dop,
        A.Claim AS FIO,
  E.DocumTypeID AS DIREDocKind,
  E.RegDate AS DataTime,
  CAST(E.DescrDoc AS VARCHAR(255)) COLLATE SQL_Latin1_General_CP1251_CS_AS AS String2,
  CAST(C.Base AS VARCHAR(512)) COLLATE SQL_Latin1_General_CP1251_CS_AS AS String4,
  O.ExcuterID AS FIO2,  
        E.RegDate AS DatClose ,
  E.JournalID AS GruppaDel,
  C.FolderID AS Delo,  
        E.ID AS LDID
FROM
 dbo.LDERC E INNER JOIN
 GRK_GRKakt A ON A.ID = E.ID INNER JOIN
 GRK_COMMONFIELDS C ON C.ID = E.ID INNER JOIN
 dbo.GRK_OUTERC O ON o.ID = E.ID INNER JOIN
 dbo.LDJOURNAL J ON J.ID = E.JournalID
WHERE J.CardTypeID = 2042


 «OLE DB Destination» отвечает за вставку данных в БД. По двойному клику открываются настройки.
Вставка данных происходит в таблицу MBAnalit БД DIR_BUFFER.
 
Настройка соответствия полей будет происходить автоматически, если в запросе выборки данных указать имена колонок таблицы-приёмника (AS NameAn).
 
Так необходимо настроить перенос всех данных.

Для ускорения, процесс переноса можно распараллелить.
Пример: записи справочников (строки MBAnalit) в проекте SSIS необходимо переносить последовательно, т.к. параллельный BULK-Insert данных в одну таблицу вызовет блокировки. Перенос данных табличных разделов (таблицы MBAnValR) можно выполнять параллельно. Последовательный и параллельный перенос данных реализуется с помощью соединения контролов и использования контейнеров (Sequence Container).
 

 

На данном шаге происходит не только перенос, но и «конвертация» структуры данных. Наборы данных LanDocs приводятся к «формату» DIRECTUM.

Шаг 2. Конвертация ИД LanDocs на ИД DIRECTUM в БД DIR_BUFFER

Конвертация ИД необходима для обеспечения целостности переносимых данных, с учётом данных, уже существующих в базе DIRECTUM.
Приступим.
Общий алгоритм конвертации будет следующий:

  1. Заполнить «служебные» поля (например, MBAnalit.Kod) и поля, которые являются ключевыми (например, MBAnalit.Analit, SBEDoc.XRecID).
  2. Заменить ИД LanDocs на новые ИД, полученные в п.1., в полях (Foreign key), которые не являются ключами (например, MBAnalit.Podr).

Выполнить произвольный скрипт в SSIS поможет контрол «Execute SQL Task».
 

Вытащим контрол в область «Control Flow» и настроим.
 


Пример запроса (SQLStatement):

DECLARE @XRecID INT

SELECT @XRecID = ValuePar FROM XIni WHERE NamePar = 'MB_AnalitID'

--Обновить идентификаторы полей
UPDATE  dbo.MBAnalit
SET     XRecID   = ( ID + @XRecID ),
  Analit   = ( ID + @XRecID ),
  UniqueNameValue = ( ID + @XRecID ),
  OriginalAn  = ( ID + @XRecID )

--Обновить Kod
UPDATE  dbo.MBAnalit
SET     Kod = ( CAST(LEFT('          ', 8 - LEN(CAST(ID AS CHAR)))
    + CAST('LD' + CAST(ID AS CHAR) AS CHAR(10)) AS CHAR(10)) ) 
WHERE MBAnalit.Kod IS NULL
    
--Обновить Vid
UPDATE  dbo.MBAnalit
SET     Vid = V.Vid
FROM MBAnalit
INNER JOIN MBVidAn V ON V.Kod = MBAnalit.LDANALIT


Для конвертации не ключевых полей добавим ещё один контрол.
 
 

Пример запроса (SQLStatement):

UPDATE  MBAnalit
SET     Podr = Period.XRecID
FROM    MBAnalit
        INNER JOIN MBAnalit AS Period ON MBAnalit.Podr = Period.LDID
WHERE   ( MBAnalit.LDANALIT = 'НМД' )
        AND ( Period.LDANALIT = 'ПОД' )
              
/*Работники. Вид должности.*/
UPDATE  M
SET     M.PostKind = Post.XRecID
FROM    MBAnalit M
        INNER JOIN MBAnalit AS Post ON Post.LDID = M.PostKind
WHERE   ( M.LDANALIT = 'РАБ' )
        AND ( Post.LDANALIT = 'PositionKinds' )

/*Работники. Орг. единица*/
UPDATE  MBAnalit
SET     Podr = Dep.XRecID
FROM    MBAnalit
        INNER JOIN MBAnalit AS Dep ON MBAnalit.Podr = Dep.LDID
WHERE   ( MBAnalit.LDANALIT = 'РАБ' )
        AND ( Dep.LDANALIT = 'ПОД' )

Аналогичную конвертацию необходимо сделать для всех таблиц с данными из LanDocs.

Шаг 3. Перенос данных из БД DIR_BUFFER в БД DIRECTUM

Это самый лёгкий в настройке шаг.
Здесь необходимо выполнить перенос данных каждой таблицы БД DIR_BUFFER в соответствующую таблицу БД DIRECTUM.
Это выполняется с помощью контролов «Data Flow Task»
 
 


Настроим выборку данных
 

Настроим вставку данных
 
Т.к. имена полей совпадают, маппинг настраивается автоматом.
 


В итоге, проект SSIS может получиться достаточно объёмным.
 
 

Запуск

Запустить проект SSIS можно по кнопке на панели инструментов, либо по F5.
 
 

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

Некоторые особенности

Заранее определить список всех особенностей и сложностей, которые могут возникнуть при переносе исторических данных, попросту невозможно. Всё зависит от перечня переносимых объектов, исходной ИС, разработки исходной ИС, разработки и бизнес логики DIRECTUM и т.п.
Рассмотрим несколько особенностей переноса данных из LanDocs в DIRECTUM.

Миграция пользователей

Пользователи (и их права) хранятся в LanDocs и DIRECTUM по-разному.
Рассмотрим пример: «пользователя переводят в другое подразделение».
В DIRECTUM у пользователя меняется Группа пользователей Подразделения.
В LanDocs создаётся «новая версия» пользователя, которая становится актуальной. «Старые версии» пользователя помечаются как не актуальные. Проблема заключается в том, что меняется ИД пользователя.

Примечание: подробное описание особенностей хранения пользователей и назначения прав есть в документации к ИС.

Таким образом, в DIRECTUM необходимо переносить только актуальные версии пользователей и создавать для них записи справочников Работники и Персоны.
При переносе полей таблиц, где фигурируют пользователи (например, поле «Автор документа» и т.п.), необходимо ИД «старых версий» пользователей LanDocs заменять на ИД «новых версий». Удобнее всего делать это при конвертации.
Отношения «ИД пользователя» - «Актуальный ИД пользователя» будут храниться в таблицу V_USERS.
1. Создадим таблицу V_USERS в базе DIR_BUFFER.

/* Создать таблицу для версий пользователей */
IF EXISTS ( SELECT  *
            FROM    sysobjects
            WHERE   id = OBJECT_ID('V_USERS') )
    DROP TABLE V_USERS
   
   
CREATE TABLE [dbo].[V_USERS]
    (
      [ID_V] [INT] NULL, — ИД версии пользователя
      [ID_O] [INT] NULL — ИД актуальной версии пользователя
)

2. Заполним
Пример запроса выборки данных:

SELECT  ID AS ID_V ,
        ( SELECT  TOP 1
          ID
          FROM      dbo.LDOBJECT O
          WHERE     o.ObjID = LDOBJECT.ObjID
          AND o.Actual IN ('+', '-')
          ORDER BY  o.Actual DESC,
          o.VersionN DESC
        ) AS ID_O
FROM    dbo.LDOBJECT
WHERE   ObjectTypeID IN (6, 20)
ORDER BY ObjID ,
        VersionN

3. При конвертации ИД пользователей, работников и персон определяем актуальную версию
Пример запроса конвертации:

/*Работники. Пользователь*/
UPDATE  MBAnalit
SET     Polzovatel = Usr.XRecID
FROM    MBAnalit
  INNER JOIN V_USERS AS UV ON UV.ID_V = MBAnalit.Polzovatel
        INNER JOIN MBAnalit AS Usr ON UV.ID_O = Usr.LDID
WHERE   ( MBAnalit.LDANALIT = 'РАБ' )
        AND ( Usr.LDANALIT = 'ПОЛ' )

Миграция организаций

Происходит по аналогии с миграцией пользователей (используется таблица V_ORG).

Миграция ЭД

Перенос карточек электронных документов

Перенос карточек электронных документов происходит аналогично переносу записей справочников. Исключение составляет лишь то, что для идентификации документа одного ИД LanDocs мало. Для уникальной идентификации документов и их версий необходимо добавить в таблицы SBEDoc и SBEDocVer базы DIR_BUFFER дополнительные поля: FileN, VerN и SubVerN, которые соответствуют полям LDVersion.FileN, LDVersion.VerN и LDVersion.SubVerN LanDocs.

Перенос тел электронных документов

Перенос тел ЭД заключается в том, чтобы скопировать файлы из файлового хранилища LanDocs в файловое хранилище DIRECTUM.
Сделать это можно следующим образом:
1. Проверить расположение файлового хранилища Landocs. Для этого в базе данных DocServer в таблице DS_STORAGES проверить пути расположения хранилищ. Пути должны совпадать с реальным расположением хранилищ на сервере.
2. Создать и заполнить таблицу TempTransferFiles в базе DIR_BUFFER.
Пример запроса:

DECLARE @Folder VARCHAR(10)
DECLARE @FS		VARCHAR(50)
DECLARE @AS		VARCHAR(50)
SET @Folder = ''
SET @FS		= 'P:\File_Storage_IM\FileStrg_CommonOperative\' — Оперативное хранилище DIR
SET @AS		= 'H:\File_Storage_IM\FileStrg_CommonArchive\' — Архивное хранилище DIR

if  exists (select * from sys.objects where object_id = object_id(N'[dbo].[TempTransferFiles]') and type in (N'U'))
 drop table [dbo].TempTransferFiles

SELECT 
    — Путь до файла в ФХ LD (Пример: I:\LanDocs\LandocsFilesDS\TempArc\1706074_1.1.PDF)
    LDS.Path + '\' + DSV.FileName AS Source,
    — Путь до файла в ФХ DIR (Пример: H:\File_Storage\FileStrg_CommonArchive\20515\20515164\1\1706074_1.1.PDF.PDF)
	@Folder + (CASE LDS.ID WHEN 1 THEN  @FS WHEN 2 THEN @AS WHEN 3 THEN @AS END) + substring(convert(varchar, V.EDocID), 1, 5) + '\' + convert(varchar, V.EDocID) + '\' + convert(varchar, V.Number) + '\' + (CAST(DSV.FileName AS VARCHAR(120)) COLLATE SQL_Latin1_General_CP1251_CS_AS) + '.' + V.TypeVersionData as Dest,
	-- Путь до промежуточной папки в ФХ DIR (Пример: H:\File_Storage\FileStrg_CommonArchive\20515)
	@Folder + (CASE LDS.ID WHEN 1 THEN  @FS WHEN 2 THEN @AS WHEN 3 THEN @AS END) + substring(convert(varchar, V.EDocID), 1, 5) as Folder1,  
    — Путь до промежуточной папки в ФХ DIR (Пример: H:\File_Storage\FileStrg_CommonArchive\20515\20515164)
    @Folder + (CASE LDS.ID WHEN 1 THEN  @FS WHEN 2 THEN @AS WHEN 3 THEN @AS END) + substring(convert(varchar, V.EDocID), 1, 5) + '\' + convert(varchar, V.EDocID) as Folder2,
    — Путь до промежуточной папки в ФХ DIR (Пример: H:\File_Storage\FileStrg_CommonArchive\20515\20515164\1)
    @Folder + (CASE LDS.ID WHEN 1 THEN  @FS WHEN 2 THEN @AS WHEN 3 THEN @AS END) + substring(convert(varchar, V.EDocID), 1, 5) + '\' + convert(varchar, V.EDocID) + '\' + convert(varchar, V.Number) as Folder3,
    0 AS Operated,
    V.EDocID AS EDocID
INTO [dbo].TempTransferFiles
FROM SBEDocVer V
INNER JOIN Landocs.dbo.LDVERSION LDV ON LDV.DocID = V.LDID AND LDV.FileN = V.FileN AND LDV.VerN = V.VerN AND LDV.SubVerN = V.SubVerN
INNER JOIN DocServer.dba.DS_VERSIONS DSV ON (DSV.DocumentID = LDV.DocID AND DSV.ID = LDV.SubVerN)
INNER JOIN DocServer.dba.DS_STORAGES LDS ON LDS.ID = DSV.StorageID
INNER JOIN SBEDoc D ON D.XRecID = V.EDocID
ORDER BY V.EDocID

3. Запустить от администратора консоль cmd.
4. В консоли запустить с необходимыми ключами утилиту LanDocsImportFiles.exe (LanDocsImportFiles.zip (4,26 Кб))

Если утилита будет запущена без ключей или ключи будут неверными, то пользователю будет выдано сообщение:
 
 

Пример запуска утилиты:

>LanDocsImportFiles.exe –S=SQLsvr –D=DIR_BUFFER –U=sa –P=123

5. Следовать инструкциям утилиты.

Риски

Основными рисками при использовании SSIS для переноса данных являются:
Риск: Нарушение целостности БД. Так как все данные переносятся «вручную» с помощью SQL запросов, IS-Builder не выполняет своих функций по поддержанию системной логики.
Совет: Необходима проверка целостности базы после миграции и тщательное тестирование
Риск: Большое время выполнения скриптов конвертации данных.
Совет: Необходимо выявлять проблемные запросы (с помощью трейсов) и оптимизировать (добавлять индексы).

Выводы

В данной статье мы рассмотрели один из способов миграции большого объёма исторических данных в систему DIRECTUM. Как было отмечено выше, основное достоинство SSIS – производительность. Достигается это за счёт использования BULK-Insert и оптимизации выполнения запросов. Применяя этот инструмент, можно перенести десятки и сотни Гигабайт данных за считанные часы (при использовании объектной модели перенос этих данных может занять месяцы).

 

Наталья Лихолап

Довелось мне недавно писать первоначальный и ежедневный импорт с помощью SSIS, к счастью не в DIRECTUM. Сначала все выглядело красиво и радужно, с большим количество цветных кубиков, которые мигали и моргали при отладке. Но пол месяца спустя весь пакет был собран из десятка кубиков, большая часть которых - Script Task.

Несколько причин отказа от стандартного функционала SSIS: 47 сплитов с каждой итерацией начинали обрабатываться все дольше и дольше, если первая была пару секунд, то сороковая - 2 минуты, дальше даже не проверяла, так как записей очень много. Потом начались проблемы с дедлоками read(!!) и readwrite параметров при использовании в параллельных блоках, пришлось в каждом блоке программно их лочить перед чтением и снимать лок после. Дальше начались проблемы с коммитами и ролбэками транзакций t-sql (удержание connection при переходе между блоками), пришлось отказаться от параллельного импорта. Говорить про преобразование типов оракловых данных в ms sql уже даже не хочется. Кстати, параллельность в SSIS - это миф.  Осталось загадкой как этот продукт планировалось использовать.

Сейчас все сносно работает, но почти все переписано на C#. Отказываться от SSIS было поздно, но в следующий раз я пять раз подумаю на чем писать импорт такого размаха, особенно уделю внимание анализу количества расчетов и мелких запросов при импорте.

SSIS хорош для использования не разработчиками и\или для несложных преобразований данных, без больших сложных вычислений и сплитов, просто взять и мышкой накидать кубики без особых правил и соединить их стрелочками. Дополнительную сложность составляет то, что казалось бы одни и те же объекты имеют разный интерфейс и слегка по разному реализованы, из-за чего на разных уровнях (Control Flow и Data Flow) работа с подобными объектами отличается. И в целом, похоже, что это технология COM завернута в .NET обертку. Вышла каша в разработке. Если можно импорт реализовать разработкой на более низком уровне - лучше писать, а не использовать кубики.

Как совет для тех, кто не работал и хочет рискнуть строить импорт пакетом SSIS - подумайте тридцать пять раз, а не проще ли будет на ISBL, если речь об импорте в DIRECTUM. Но, правда, если импорт простой - то должно получиться хорошо и красиво.

зы: Было бы хорошо услышать положительные отзывы от тех, кто готовил пакет SSIS для более-менее сложного импорта.

Андрей Шестаков

Добрый день, Наталья!

Спасибо за комментарий!

Начну с того, что я с Вами полностью согласен. Ваш пример идее статьи не противоречит, а органично её дополняет в части минусов и рисков применения SSIS (а их действительно много).

Для каждого проекта и каждой задачи нужно выбирать инструмент, который позволит сэкономить затраты исполнителя и не ударит по качеству работ. Из этого следует, что оценивать тот или иной инструмент по опыту одного проекта попросту нельзя, ведь всегда решаются уникальные задачи. Мне хотелось показать коллегам SSIS (возможно, не все о нём слышали), как инструмент, успешно применённый для конкретной задачи.

Кстати, параллельность в SSIS - это миф.

В моём случае, перенос независимых данных распараллелился очень удачно. Конечно же данные лежали в разных таблицах. В совокупности с правильным распределением по жёстким дискам, это дало хороший прирост производительности.

 

Если можно импорт реализовать разработкой на более низком уровне - лучше писать, а не использовать кубики.

Данные кубики как раз и предназначены для того, чтобы не писать всё на низком уровне. Страдает ли гибкость? Конечно. Варианты реализации выбирать нам самим)

 

зы: Было бы хорошо услышать положительные отзывы от тех, кто готовил пакет SSIS для более-менее сложного импорта.

Один пример успешного применения как раз описан в статье.
Если у кого-то есть опыт применения SSIS, делитесь не стесняйтесь.

Авторизуйтесь, чтобы написать комментарий