使用说明:
配置schemname,表需要移到的空间,索引需要移入的空间。
该工具支持分区表
该工具只支持普通索引,不支持文艺索引~也不支持~
该工具支持断点续作:例如 某一个schema 有一万个表,移到九千个表时断掉了,再次运行该工具,会继续移动剩余的一千个表。之前的九千个表不做重复移动。
该工具配置简单,支持索引并行在线创建。
实在是居家旅游,杀人灭口必备良器。
如需扩展其他功能,请与作者:道行尚浅(QQ:122252261),视难易程度收取饭费。(饭费等级:街边摊,快餐,火锅,炒菜,海鲜,至尊套餐 不等~)
配置schemname,表需要移到的空间,索引需要移入的空间。
该工具支持分区表
该工具只支持普通索引,不支持文艺索引~也不支持~
该工具支持断点续作:例如 某一个schema 有一万个表,移到九千个表时断掉了,再次运行该工具,会继续移动剩余的一千个表。之前的九千个表不做重复移动。
该工具配置简单,支持索引并行在线创建。
实在是居家旅游,杀人灭口必备良器。
如需扩展其他功能,请与作者:道行尚浅(QQ:122252261),视难易程度收取饭费。(饭费等级:街边摊,快餐,火锅,炒菜,海鲜,至尊套餐 不等~)
DECLARE
V_SCHEMA_NAME VARCHAR2(200) := 'SH';
V_TABLE_TABLESPACE VARCHAR2 (100 ) := 'USERS' ;
V_INEDX_TABLESPACE VARCHAR2 (100 ) := 'TEST' ;
V_PARAEL_DEGREE VARCHAR2(200) := '1';
BEGIN
FOR R IN (SELECT 'ALTER TABLE ' || DBT.OWNER || '.' || DBT.TABLE_NAME ||
' MOVE ' || ( CASE
WHEN DTP.PARTITION_NAME IS NOT NULL THEN
' PARTITION ' || DTP.PARTITION_NAME
END) || ' TABLESPACE ' || V_TABLE_TABLESPACE DDL_STATMENT,
DBT.OWNER OWNER,
DBT.TABLE_NAME TABLE_NAME,
ROW_NUMBER() OVER( PARTITION BY DBT.OWNER, DBT.TABLE_NAME ORDER BY DBT.TABLE_NAME, DTP.PARTITION_POSITION) PAR_POSTION,
COUNT(*) OVER( PARTITION BY DBT.OWNER, DBT.TABLE_NAME) PAR_CNT
FROM DBA_TABLES DBT, DBA_TAB_PARTITIONS DTP
WHERE DBT.TABLE_NAME = DTP.TABLE_NAME(+)
AND DBT.OWNER = DTP.TABLE_OWNER(+)
AND DBT.OWNER = V_SCHEMA_NAME
AND (DBT.TABLESPACE_NAME != V_TABLE_TABLESPACE OR
(DBT.TABLESPACE_NAME IS NULL AND
DTP.TABLESPACE_NAME != V_TABLE_TABLESPACE))
ORDER BY DBT.TABLE_NAME ,PAR_POSTION ) LOOP
-- DBMS_OUTPUT.PUT_LINE(R.DDL_STATMENT);
execute immediate R.DDL_STATMENT ;
IF R.PAR_POSTION = R.PAR_CNT THEN
FOR R_INX IN (SELECT ' ALTER INDEX ' || DI.OWNER || '.' ||
DI.INDEX_NAME || ' REBUILD ' || (CASE
WHEN DIP.PARTITION_NAME IS NOT NULL THEN
'PARTITION ' || DIP.PARTITION_NAME
END) || ' COMPUTE STATISTICS ONLINE PARALLEL ' ||
V_PARAEL_DEGREE || ' TABLESPACE ' ||
V_INEDX_TABLESPACE INDEX_DDL
FROM DBA_INDEXES DI, DBA_IND_PARTITIONS DIP
WHERE DI.OWNER = DIP.INDEX_OWNER(+)
AND DI.INDEX_NAME = DIP.INDEX_NAME(+)
AND DI.owner=DI.table_owner
AND DI.TABLE_OWNER = R.OWNER
AND DI.TABLE_NAME = R.TABLE_NAME
AND DI.index_type = 'NORMAL'
AND (DI.TABLESPACE_NAME != V_INEDX_TABLESPACE OR
(DI.TABLESPACE_NAME IS NULL AND
DIP.TABLESPACE_NAME != V_INEDX_TABLESPACE)))
LOOP
EXECUTE IMMEDIATE R_INX.INDEX_DDL ;
-- DBMS_OUTPUT.PUT_LINE(R_INX.INDEX_DDL);
END LOOP;
END IF;
END LOOP;
FOR R_FINAL IN (
select ' alter index ' || diP.index_owner || '.' ||
diP.index_name || ' rebuild ' || ' partition ' ||
dip.partition_name ||
' compute statistics online parallel ' ||
V_PARAEL_DEGREE || ' TABLESPACE ' ||
V_INEDX_TABLESPACE INDEX_DDL
from dba_ind_partitions DIP
where 1 = 1
and DIP.index_owner = V_SCHEMA_NAME
and DIP.tablespace_name != V_INEDX_TABLESPACE
UNION ALL
SELECT ' alter index ' || di.owner || '.' || di.index_name ||
' rebuild ' ||
' compute statistics online parallel ' ||
V_PARAEL_DEGREE || ' TABLESPACE ' ||
V_INEDX_TABLESPACE
FROM DBA_INDEXES DI
WHERE DI.owner = V_SCHEMA_NAME
AND DI.tablespace_name != V_INEDX_TABLESPACE
AND DI.table_owner=DI.owner
AND DI.index_type= 'NORMAL')
LOOP
-- DBMS_OUTPUT.put_line(R_FINAL.INDEX_DDL);
EXECUTE IMMEDIATE R_FINAL.INDEX_DDL ;
END LOOP ;
END;
V_SCHEMA_NAME VARCHAR2(200) := 'SH';
V_TABLE_TABLESPACE VARCHAR2 (100 ) := 'USERS' ;
V_INEDX_TABLESPACE VARCHAR2 (100 ) := 'TEST' ;
V_PARAEL_DEGREE VARCHAR2(200) := '1';
BEGIN
FOR R IN (SELECT 'ALTER TABLE ' || DBT.OWNER || '.' || DBT.TABLE_NAME ||
' MOVE ' || ( CASE
WHEN DTP.PARTITION_NAME IS NOT NULL THEN
' PARTITION ' || DTP.PARTITION_NAME
END) || ' TABLESPACE ' || V_TABLE_TABLESPACE DDL_STATMENT,
DBT.OWNER OWNER,
DBT.TABLE_NAME TABLE_NAME,
ROW_NUMBER() OVER( PARTITION BY DBT.OWNER, DBT.TABLE_NAME ORDER BY DBT.TABLE_NAME, DTP.PARTITION_POSITION) PAR_POSTION,
COUNT(*) OVER( PARTITION BY DBT.OWNER, DBT.TABLE_NAME) PAR_CNT
FROM DBA_TABLES DBT, DBA_TAB_PARTITIONS DTP
WHERE DBT.TABLE_NAME = DTP.TABLE_NAME(+)
AND DBT.OWNER = DTP.TABLE_OWNER(+)
AND DBT.OWNER = V_SCHEMA_NAME
AND (DBT.TABLESPACE_NAME != V_TABLE_TABLESPACE OR
(DBT.TABLESPACE_NAME IS NULL AND
DTP.TABLESPACE_NAME != V_TABLE_TABLESPACE))
ORDER BY DBT.TABLE_NAME ,PAR_POSTION ) LOOP
-- DBMS_OUTPUT.PUT_LINE(R.DDL_STATMENT);
execute immediate R.DDL_STATMENT ;
IF R.PAR_POSTION = R.PAR_CNT THEN
FOR R_INX IN (SELECT ' ALTER INDEX ' || DI.OWNER || '.' ||
DI.INDEX_NAME || ' REBUILD ' || (CASE
WHEN DIP.PARTITION_NAME IS NOT NULL THEN
'PARTITION ' || DIP.PARTITION_NAME
END) || ' COMPUTE STATISTICS ONLINE PARALLEL ' ||
V_PARAEL_DEGREE || ' TABLESPACE ' ||
V_INEDX_TABLESPACE INDEX_DDL
FROM DBA_INDEXES DI, DBA_IND_PARTITIONS DIP
WHERE DI.OWNER = DIP.INDEX_OWNER(+)
AND DI.INDEX_NAME = DIP.INDEX_NAME(+)
AND DI.owner=DI.table_owner
AND DI.TABLE_OWNER = R.OWNER
AND DI.TABLE_NAME = R.TABLE_NAME
AND DI.index_type = 'NORMAL'
AND (DI.TABLESPACE_NAME != V_INEDX_TABLESPACE OR
(DI.TABLESPACE_NAME IS NULL AND
DIP.TABLESPACE_NAME != V_INEDX_TABLESPACE)))
LOOP
EXECUTE IMMEDIATE R_INX.INDEX_DDL ;
-- DBMS_OUTPUT.PUT_LINE(R_INX.INDEX_DDL);
END LOOP;
END IF;
END LOOP;
FOR R_FINAL IN (
select ' alter index ' || diP.index_owner || '.' ||
diP.index_name || ' rebuild ' || ' partition ' ||
dip.partition_name ||
' compute statistics online parallel ' ||
V_PARAEL_DEGREE || ' TABLESPACE ' ||
V_INEDX_TABLESPACE INDEX_DDL
from dba_ind_partitions DIP
where 1 = 1
and DIP.index_owner = V_SCHEMA_NAME
and DIP.tablespace_name != V_INEDX_TABLESPACE
UNION ALL
SELECT ' alter index ' || di.owner || '.' || di.index_name ||
' rebuild ' ||
' compute statistics online parallel ' ||
V_PARAEL_DEGREE || ' TABLESPACE ' ||
V_INEDX_TABLESPACE
FROM DBA_INDEXES DI
WHERE DI.owner = V_SCHEMA_NAME
AND DI.tablespace_name != V_INEDX_TABLESPACE
AND DI.table_owner=DI.owner
AND DI.index_type= 'NORMAL')
LOOP
-- DBMS_OUTPUT.put_line(R_FINAL.INDEX_DDL);
EXECUTE IMMEDIATE R_FINAL.INDEX_DDL ;
END LOOP ;
END;