问题描述
如何将索引移动到另一个表空间
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;
解决方法
因为您还需要可以从 user[all/dba]_tab_partitions
字典视图访问的分区名称信息。如果你得到了相关的分区名称,那么
ALTER INDEX PK_REFUND_ID REBUILD PARTITION PR_REFUND_OLD [ONLINE];
可能仅用于重建索引。
或
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;
/