Здравствуйте !
Это будет неклассическая пятничная задачка, поскольку в ней у меня есть и шкурный
интерес :-) Хотя решение и есть, но был бы очень рад, если бы нашлось что- то получше.
Так как пятничные задачки сейчас довольно редки, надеюсь Вы не будете
на меня в обиде. Задачка взята из повседневной практики ....
Тут нужно немного рассказать о нашей специфике.
Дело в том, что разработчики для проектирования и создания
объектов баз данных используют CASE- средства, которые генерируют
информацию о созданных элементах в специальные таблицы, а затем некое
программное средство на основе данных из таблицы генерирует сами объекты.
Это происходит и с индексами.
Разработчики могут изменить существующий индекс, добавить новый ...
Когда приходит новый релиз / багфикс, разработчики поставляют эти инсерты на вход
программного продукта.
Важная особенность состоит в том, что неизменившиеся индексы тоже попадают
в таблице, так как они уже пристутствуют в диаграмме, на основе которой
генерируется файл.
Программный продукт проверяет , а не менялась ли информация по индексу в словаре
и если не менялась , не делает ничего. В противном случае удаляет индекс и снова
добавляет.
И все шло хорошо, пока не появились FBI. Оракл оптимизирует индексы и то,
что лежит в dba_ind_expressions становится совершенно не похоже на то,
что лежит в нашей таблице, пришедшей от разработчиков.
Я не говорю в данном случае о строчных / прописных буквах , о двойных кавычках,
и даже о количестве пробелов.
Пример
SQL> create index scott.emp_dat_format on scott.emp(nvl(hiredate, '01.01.1980'))
2 /
Index created
SQL> select column_expression from dba_ind_expressions
2 where index_name = 'EMP_DAT_FORMAT'
3 /
COLUMN_EXPRESSION
--------------------------------------------------------------------------------
NVL("HIREDATE",TO_DATE('1980-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))
SQL>
Понятно, что Оракл поступает хорошо :-), исправляя грязную работу разработчика.
Но нам от этого не легче. Как результат в огромной базе неизменившиеся FBI
удалялись и снова создавались, что привело к огромным и ненужным
потерям времени.
Что делать ? :-)