Как переместить индексы в другое табличное пространство

как переместить индексы в другое табличное пространство

select owner, index_name, TABLE_NAME, a.TABLESPACE_NAME 
from all_indexes a where a.TABLE_NAME = 'REFUND';

введите здесь описание изображения

ALTER INDEX CBS.PK_REFUND_ID REBUILD TABLESPACE T_IDX;

ORA-14086: Разделенный индекс не может быть перестроен целиком.

введите здесь описание изображения

Я не могу выполнить этот оператор, потому что я не знаю, в каком разделе находится индекс.

ALTER INDEX PK_REFUND_ID REBUILD PARTITION xxxxxx TABLESPACE T_IDX;


person Tomas    schedule 31.01.2021    source источник
comment
Возможно, запустите alter session set nls_language = 'American', чтобы получить сообщение об ошибке на английском языке. И, пожалуйста, не вставляйте изображения, см. meta.stackoverflow.com/a/285557/3027266.   -  person Wernfried Domscheit    schedule 31.01.2021


Ответы (1)


Потому что вам также нужна информация об имени раздела, которую можно получить из user[all/dba]_tab_partitions представления словаря. Если вы получили соответствующее имя раздела, то

ALTER INDEX PK_REFUND_ID REBUILD PARTITION PR_REFUND_OLD [ONLINE];

может использоваться только для перестроения индекса.

or

ALTER INDEX PK_REFUND_ID REBUILD PARTITION PR_REFUND_OLD [ONLINE] TABLESPACE T_IDX;

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

Используйте следующий код для запуска в качестве пакетного задания

DECLARE
  v_ts_name VARCHAR2(35) := 'T_IDX';
BEGIN
  FOR c IN
    (  
    SELECT 'ALTER INDEX '||i.index_name||' REBUILD PARTITION '||p.partition_name||
          ' ONLINE TABLESPACE '||v_ts_name AS command
      FROM user_part_indexes i
      JOIN user_ind_partitions p
        ON p.index_name = i.index_name 
       AND i.table_name = 'REFUND'
       AND p.tablespace_name != v_ts_name
    )
  LOOP
    EXECUTE IMMEDIATE c.command;
  END LOOP;   
END;
/
person Barbaros Özhan    schedule 31.01.2021
comment
Я думаю, вам лучше запросить представление USER_IND_PARTITIONS, потому что p.partition_name — это имя раздела table. Имя раздела индекса может отличаться от имени раздела таблицы — они могут быть даже полностью независимыми, см. stackoverflow.com/questions/57107906/ - person Wernfried Domscheit; 31.01.2021
comment
точно, спасибо @WernfriedDomscheit - person Barbaros Özhan; 31.01.2021