Процессы происходящие при реструктуризации:
- Изначально для каждой таблицы, которую нужно реструктуризовать создается таблица с нужной структурой (набором колонок), имя новой таблицы будет дополнено символами "NG" (_InfoReg13763NG).
- Потом происходит преобразование данных из старой таблицы в новую порциями по 1000 строк. Все преобразование данных выполняется на клиенте, с которого выполняется реструктуризация(обновление).
- По завершении преобразования старая таблица удаляется, а новая переименовывается (обрезаются символы "NG").
Процесс не вызывает проблем пока вы оперируете с малым объемом данных, при больших объемах (таблицы в десятки Гб или десятки миллионов строк) нужно учитывать несколько аспектов, о которых я попытаюсь рассказать.
Место на дисках
Поскольку к концу второго этапа, у Вас в базе данных будет находится фактически две таблицы вместо одной, при полной реструктуризации, рассчитывайте на соответвующее увеличение объема БД (2*x при полной реструктуризации).
Я так же рекомендую перевести базу на время реструктуризации в простой режим восстановления.
Индикация процесса
После нескольких десятков минут реструктуризации, окно предприятия выбросит белый флаг и заветных строчек в строке состояния "Реструктуризация Справочник Банки 30%...." мы больше не увидим. Остается только смотреть логи СУБД чтобы понять, что жизнь еще теплится.
В данном случае я перелагаю инструкцию T-SQL, которая показывает процент выполненной реструктуризации для каждой (из всех необходимых) таблицы.
Declare @Table varchar(50) Declare Structur cursor local FOR Select So1.Name from dbo.sysobjects So INNER JOIN dbo.sysobjects So1 ON So.Name = (So1.Name+'NG') And OBJECTPROPERTY(So.id, N'IsUserTable') = 1 Create Table #StructurTable( _Table varchar(50), _Rows numeric, _Rows1 numeric) Open Structur Fetch Next From Structur Into @Table While @@fetch_status=0 Begin INSERT INTO #StructurTable EXECUTE('Select '''+@Table+''', Count(*), 0 From '+@Table+' UNION ALL Select '''+@Table+''',0,Count(*) From '+@Table+'NG') Fetch Next From Structur Into @Table End Close Structur Deallocate Structur Select _Table, CAST(Case _Rows1 When 0 Then 100 Else _Rows1*100/_Rows End AS numeric(15,2)) Precent FROM (Select _Table, Max(_Rows1) _Rows1, Max(_Rows) _Rows FROM #StructurTable Group By _Table) As Tab DROP TABLE #StructurTable
Комментариев нет:
Отправить комментарий