отбрасывать секционированные таблицы с глобальными индексами? - PullRequest
0 голосов
/ 11 января 2019
PROCEDURE purge_partitions
   (
      p_owner            IN VARCHAR2
     ,p_name             IN VARCHAR2
     ,p_retention_period IN NUMBER
   ) IS
   BEGIN
      FOR partition_rec IN (SELECT partition_name
                                  ,high_value
                              FROM dba_tab_partitions
                             WHERE table_owner = p_owner
                               AND table_name = p_name)

      LOOP
         IF SYSDATE >= add_months(to_date(substr(partition_rec.high_value
                                                ,12
                                                ,19)
                                         ,'YYYY-MM-DD HH24:MI:SS')
                                 ,p_retention_period)
         THEN
            execute_immediate('ALTER TABLE ' || p_owner || '.' ||
                              p_name || ' DROP PARTITION ' ||
                              partition_rec.partition_name)
         END IF;
      END LOOP;
   END purge_partitions;

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

1 Ответ

0 голосов
/ 11 января 2019

Рассмотрим update_index_clauses, который поддерживает действительность индексов.

См. Документацию и рассмотрение глобальных индексов здесь

в вашем случае это будет:

 alter table ttttt drop partition pppppp update global indexes;

В качестве альтернативы, пусть индексы будут аннулированы в DROP PARTITION и перестроены с помощью alter index xxx rebuild. Вы можете получить список индексов для восстановления из этого запроса

select OWNER, INDEX_NAME  
from all_indexes 
where owner = 'ooo' and table_name = 'tttttt' and status = 'UNUSABLE';
...