Suppose that we want to move all the mid-size indexes for a given schema FOO, into their own tablespace. First, let’s list them all:
SELECT ext.owner, index_name, SUM (bytes) / (1024 * 1024) MB FROM dba_extents ext JOIN dba_indexes idx ON idx.owner = ext.owner AND idx.index_name = ext.segment_name WHERE ext.owner = 'FOO' AND segment_type = 'INDEX' AND index_type = 'NORMAL' GROUP BY ext.owner, index_name HAVING SUM (bytes) / (1024 * 1024) > 8 ORDER BY MB DESC
How large does the tablespace need to be?
SELECT 1.25 * SUM (bytes) / (1024 * 1024) MB FROM dba_extents ext JOIN dba_indexes idx ON idx.owner = ext.owner AND idx.index_name = ext.segment_name WHERE ext.owner = 'FOO' AND segment_type = 'INDEX' AND index_type = 'NORMAL' ORDER BY MB DESC
To populate the tablespace we could use:
SELECT 'alter index '||ext.owner||'.'||segment_name||' rebuild tablespace '||:new_ts||';' FROM dba_extents ext JOIN dba_indexes idx ON idx.owner = ext.owner AND idx.index_name = ext.segment_name WHERE ext.owner = 'FOO' AND segment_type = 'INDEX' AND index_type = 'NORMAL' GROUP BY ext.owner, segment_name, segment_type HAVING SUM (bytes) / (1024 * 1024) > 8 ORDER BY SUM (bytes) / (1024 * 1024) DESC
Now suppose we want to move all tables (including index organized) for a given schema FOO into their own tablespace. To list them:
SELECT owner, table_name, SUM (bytes) / (1024 * 1024) MB FROM (SELECT ext.owner, table_name, bytes FROM dba_extents ext JOIN dba_tables tbl ON tbl.owner = ext.owner AND table_name = ext.segment_name WHERE ext.owner = 'FOO' UNION ALL SELECT ext.owner, table_name, bytes FROM dba_extents ext JOIN dba_indexes idx ON idx.owner = ext.owner AND idx.index_name = ext.segment_name WHERE ext.owner = 'FOO' AND segment_type = 'INDEX' AND index_type = 'IOT - TOP') GROUP BY owner, table_name, bytes HAVING SUM (bytes) / (1024 * 1024) > 8 ORDER BY MB DESC;
How large does the tablespace need to be?
SELECT 1.25 * SUM (bytes) / (1024 * 1024) MB FROM (SELECT ext.owner, table_name, bytes FROM dba_extents ext JOIN dba_tables tbl ON tbl.owner = ext.owner AND table_name = ext.segment_name WHERE ext.owner = 'FOO' UNION ALL SELECT ext.owner, table_name, bytes FROM dba_extents ext JOIN dba_indexes idx ON idx.owner = ext.owner AND idx.index_name = ext.segment_name WHERE ext.owner = 'FOO' AND segment_type = 'INDEX' AND index_type = 'IOT - TOP')
To populate the tablespace we could use:
SELECT 'alter table '|| owner|| '.'|| table_name || ' move tablespace '|| :new_ts|| ';' FROM (SELECT owner, table_name FROM dba_tables tbl WHERE owner = 'FOO' UNION ALL SELECT owner, table_name FROM dba_indexes idx WHERE owner = 'FOO' AND index_type = 'IOT - TOP') SELECT 'alter index ' || owner || '.' || index_name || ' rebuild;' FROM dba_indexes WHERE owner = 'FOO' AND status = 'UNUSABLE'