*** Table Fragmentation select table_name,round((blocks*8),2) "size (kb)" , round((num_rows*avg_row_len/1024),2) "actual_data (kb)", (round((blocks*8),2) - round((num_rows*avg_row_len/1024),2)) "wasted_space (kb)" from dba_tables where owner='&OWNER' and table_name='&TABLE_NAME' and (round((blocks*8),2) > round((num_rows*avg_row_len/1024),2)) order by 4 desc; *** There are many methods. Option 1: Shrink command alter table enable row movement; /* Using the enable row movement clause can reduce the clustering_factor for a primary access index, causing excessive I/O. Oracle introduced the sorted gash cluster as a way to keep an index in-order with the table rows, a technique that greatly reduces I/O for common queries. Beware that using "enable row movement" can cause Oracle to move rows to discontinuous data blocks, causing a performance problem. Remember, the physical placement of rows on data blocks can still make a huge difference in query performance. */ alter table shrink space compact; alter table shrink space cascade; http://www.dba-oracle.com/t_enable_row_movement.htm Option 2: Table move Alter table move - The alter table xxx move command moves rows down into un-used space and adjusts the HWM but does not adjust the segments extents, and the table size remains the same. The alter table move syntax also preserves the index and constraint definitions. ALTER TABLE MOVE; Option 3: EXPORT / IMPORT ** EXPORT ** DROP ALL RESPECTIVE OBJECTS ** IMPORT FROM EXPORT BACKUP Option 4: EXPORT / IMPORT WITH TABLE_EXISTS_ACTION=REPLACE ** EXPORT ** IMPORT USING TABLE_EXISTS_ACTION=REPLACE