пятница, 8 октября 2010 г.

Удаление потерянных данных в SNP_EXP_TXT.

Приветствую.

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


Привет народ. Есть небольшой "баг" в ODI, который заключается в том, что не очищается таблица SNP_EXP_TXT, когда удаляется "родительская" запись.

Так происходит потому, что в модели репозитория нет внешнего ключа между SNP_EXP_TXT и ее несколькими родительскими таблицами, именно потому, что таких таблиц несколько.

Такая ситуация может привести к быстрому росту количества записей, большинство из которых абсолютно бесполезны. Только что видел репозиторий в котором было более 50 млн записей в этой таблице, из которых записей нужных - меньше 100к.

Как следствие - очень долгая реакция интерфейса Оператора или Дизайнера, когда вы пытаетесь обратиться к какому-то объекту.
Чтобы разрешить эту ситуацию, вам просто нужно запустить следующий скрипт:

ВНИМАНИЕ: ЭТОТ СКРИПТ РАБОТАЕТ НАПРЯМУЮ С ТАБЛИЦАМИ РЕПОЗИТОРИЯ ODI. ВЫПОЛНЯТЬ ЕГО НЕОБХОДИМО ТОЛЬКО С ПОЛНЫМ НАБОРОМ ТАБЛИЦ В ПОДЗАПРОСЕ. В ПРОТИВНОМ СЛУЧАЕ ВЫ МОЖЕТЕ УДАЛИТЬ ПРАВИЛЬНЫЕ ЗАПИСИ И ИСПОРТИТЬ РЕПОЗИТОРИЙ ODI ДО НЕРАБОТАЮЩЕГО СОСТОЯНИЯ.

/* DELETE */ SELECT * FROM snp_exp_txt snp LEFT OUTER JOIN
(
select distinct I_TXT_TASK_MESS I_TXT from SNP_SESS_TASK_LOG
union all
select distinct I_TXT_SCEN I_TXT from SNP_SCEN
union all
select distinct I_TXT_SESS_MESS I_TXT from SNP_SCEN_REPORT
union all
select distinct I_TXT_DESCRIPTION I_TXT from SNP_SCEN_FOLDER
union all
select distinct I_TXT_SESS_MESS I_TXT from SNP_SESSION
union all
select distinct I_TXT_SESS_PARAMS I_TXT from SNP_SESSION
union all
select distinct I_TXT_STEP_MESS I_TXT from SNP_STEP_REPORT
union all
select distinct I_TXT_STEP_MESS I_TXT from SNP_STEP_LOG
union all
select distinct I_TXT_VAR I_TXT from SNP_VAR_SESS
union all
select distinct I_TXT_DEF_T I_TXT from SNP_VAR_SESS
union all
select distinct I_TXT_VAR I_TXT from SNP_VAR_SCEN
union all
select distinct I_TXT_DEF_T I_TXT from SNP_VAR_SCEN
union all
select distinct I_TXT as I_TXT from SNP_TXT
union all
select distinct I_TXT_VAR_IN as I_TXT from SNP_VAR
union all
select distinct I_TXT_VAR_T as I_TXT from SNP_VAR_DATA
) UNION_TABLES ON UNION_TABLES.I_TXT = snp.I_TXT
where UNION_TABLES.I_TXT is null


Это запрос для репозитория хранящегося в СУБД Oracle. Адаптируйте его под нужную СУБД.

Также вы можете подключить репозиторий ODI как источник данных в Менеджере Топологий и перенести этот скрипт в процедуру ODI. Сгенерированный из этой процедуры сценарий можно запланировать на ежемесячный запуск.


Мои примечания. Как и все, что не просто читает таблицы репозитория ODI, это удаление данных несколько пугает. Именно поэтому я закоментировал команду DELETE в скрипте. Для начала неплохо было бы посчитать количество потерянных записей в SNP_EXP_TXT. На моем текущем проекте их около 5%. Наверное, пока, пусть поживут.

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

Комментариев нет:

Отправить комментарий