суббота, 27 марта 2010 г.

В ожидании реструктуризации

Реструктуризация информационной базы 1Сv8 может происходить в момент обновления, если изменилась структура таблиц или запущена принудительно - пользователем через функционал тестирования и исправления.

Процессы происходящие при реструктуризации:

  1. Изначально для каждой таблицы, которую нужно реструктуризовать создается таблица с нужной структурой (набором колонок), имя новой таблицы будет дополнено символами "NG" (_InfoReg13763NG).
  2. Потом происходит преобразование данных из старой таблицы в новую порциями по 1000 строк. Все преобразование данных выполняется на клиенте, с которого выполняется реструктуризация(обновление). 
  3. По завершении преобразования старая таблица удаляется, а новая переименовывается (обрезаются символы "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

Приведение в чувство

Обязательный Shrink, с контрольной переиндексацией. Ну и незабываем про режим восстановления.