SELECT /*+ rule */

          'ALTER DATABASE DATAFILE '''

       || FILE_NAME

       || ''' RESIZE '

       || CEIL ((NVL (HWM, 1) * 8192) / 1024 / 1024)

       || 'M;'

  FROM DBA_DATA_FILES  DBADF

       LEFT JOIN (  SELECT FILE_ID, MAX (BLOCK_ID + BLOCKS - 1) HWM

                      FROM DBA_EXTENTS

                  GROUP BY FILE_ID) DBAFS

           ON DBADF.FILE_ID = DBAFS.FILE_ID

 WHERE       CEIL (BLOCKS * 8192 / 1024 / 1024)

           - CEIL ((NVL (HWM, 1) * 8192) / 1024 / 1024) >

           0

       AND DBADF.tablespace_name = 'MYTBS1';
column value new_val blksize
select value from v$parameter where name = 'db_block_size'
/

set pages 0
set lines 300
column cmd format a300 word_wrapped

select 'alter database datafile '''||file_name||''' resize ' ||
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 )  || 'm;' cmd
from dba_data_files a, 
     ( select file_id, max(block_id+blocks-1) hwm
         from dba_extents
        group by file_id ) b
where a.file_id = b.file_id(+) 
  and ceil( blocks*&&blksize/1024/1024) -
      ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
/
select a.tablespace_name, a.file_name,(b.maximum+c.blocks-1)*d.db_block_size highwater
from dba_data_files a,(select file_id,max(block_id)
     maximum from dba_extents group by file_id) b ,dba_extents c ,--这里c.blocks-1 不太对
     (select value db_block_size from v$parameter
     where name='db_block_size') d
where a.file_id = b.file_id
      and c.file_id = b.file_id
      and c.block_id = b.maximum
order by a.tablespace_name,a.file_name

SCRIPT 1: 

--NOTE: Run the below three select statement one by one --
set verify off
set pages 1000
column file_name format a50 word_wrapped
column smallest format 999,990 heading "Smallest|Size|Poss."
column currsize format 999,990 heading "Current|Size"
column savings  format 999,990 heading "Poss.|Savings"
break on report
compute sum of savings on report

--To Check Database block size:--
column value new_val blksize
select value from v$parameter where name = 'db_block_size'
/

-- To check how much space can be reclaimed --
select file_name,
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
       ceil( blocks*&&blksize/1024/1024) currsize,
       ceil( blocks*&&blksize/1024/1024) -
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
from dba_data_files a,
     ( select file_id, max(block_id+blocks-1) hwm
         from dba_extents
        group by file_id ) b
where a.file_id = b.file_id(+)
/

--Script to reclaim unused space from the datafiles of respective tablespace--
set pages 0
set lines 300
column cmd format a300 word_wrapped

select 'alter database datafile '''||file_name||''' resize ' ||
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 )  || 'm;' cmd
from dba_data_files a, 
     ( select file_id, max(block_id+blocks-1) hwm
         from dba_extents
        group by file_id ) b
where a.file_id = b.file_id(+) 
  and ceil( blocks*&&blksize/1024/1024) -
      ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
/
1

1

Very effective is also moving everything to another new tablespace online:

## Lobs
select 'ALTER TABLE '||s.owner||'.'||l.table_name||' MOVE LOB('||l.column_name||') STORE AS (TABLESPACE USERNAME) online;' 
  from dba_segments s, dba_lobs l
 where s.segment_name = l.segment_name
   and s.tablespace_name = 'USERNAME'
   and segment_type='LOBSEGMENT'
   and partition_name is null;

## Tables move
select 'ALTER TABLE '||owner||'.'||table_name||' move tablespace '||'USERNAME online;' from dba_tables where tablespace_name='USERS'and Owner='USERNAME';


## Move / rebuild indexes 
select 'ALTER INDEX '||owner||'.'||index_name||' REBUILD TABLESPACE '||'USERNAME_INDEX parallel 8 online;' 
from dba_indexes where tablespace_name='USERS';


## Lob Index move 
select 'alter table '||owner||'.'||table_name||' move lob ('||column_name||') store as '||SEGMENT_NAME||' (tablespace USERNAME_INDEX);'from dba_lobs where OWNER='USERNAME' and tablespace_name='USERS';

##
Check Lob indexes
select index_name,index_type, table_name,table_type, tablespace_name from dba_indexes where tablespace_name='USERNAME' order by 3;
select index_name,index_type, table_name,table_typ
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐