Skip to main content

Brief practice about shrink extents

Today after analyzing segments I found out some tables have 0 rows but segment size more than 2 GB. For practice purpose I simulated some actions on test environment. To do that I created a simple user, grant him essential grants, created table, load some data etc.

 create user ulfet identified by ulfet;  
 grant connect, resource to ulfet; 

--create table with 1 mln rows
 create table ulfet.btt nologging as  
 SELECT   
        LEVEL id,      
        dbms_random.string ('U', 10) text1,   
        reverse(dbms_random.string ('U', 10)) text2  
 FROM   dual  
 CONNECT BY   LEVEL   <= 1000000;  

--Check segment, block size
 SQL> select  
           bytes,   
           bytes/1024/1024 SIZEMB,   
           extents,   
           s.blocks,  
           t.num_rows,   
           t.last_analyzed,   
           t.blocks  
 from dba_segments s, dba_tables t  
 where s.segment_name = t.table_name   
 and segment_name='BTT'; 

 BYTES,SIZEMB,EXTENTS,BLOCKS,NUM_ROWS,LAST_ANALYZED,BLOCKS_1  
 37748736,36,51,4608,,,  





--compute statistics
 analyze table ulfet.btt compute statistics; 

--Check again segment, block size
SQL> select  
           bytes,   
           bytes/1024/1024 SIZEMB,   
           extents,   
           s.blocks,  
           t.num_rows,   
           t.last_analyzed,   
           t.blocks  
 from dba_segments s, dba_tables t  
 where s.segment_name = t.table_name and segment_name='BTT';  

 BYTES,SIZEMB,EXTENTS,BLOCKS,NUM_ROWS,LAST_ANALYZED,BLOCKS_1  
 37748736,36,51,4608,1000000,14.10.2015 10:03:04,4504 

--inserted 15 000 000 rows
 insert into ulfet.btt  
 select * from ulfet.btt;  

 insert into ulfet.btt  
 select * from ulfet.btt;  

 insert into ulfet.btt  
 select * from ulfet.btt;  

 insert into ulfet.btt  
 select * from ulfet.btt;  

 select count(1) from ulfet.btt;  
 --16000000  
commit;

Now check segment size
 SQL> select  
           bytes,   
           bytes/1024/1024 SIZEMB,   
           extents,   
           s.blocks,  
           t.num_rows,   
           t.last_analyzed,   
           t.blocks  
 from dba_segments s, dba_tables t  
 where s.segment_name = t.table_name and segment_name='BTT';  

 BYTES,SIZEMB,EXTENTS,BLOCKS,NUM_ROWS,LAST_ANALYZED,BLOCKS_1  
 587202560,560,141,71680,1000000,14.10.2015 10:03:04,4504 

--gather table`s stat again for fresh statistics
 EXEC DBMS_STATS.gather_table_stats('ULFET', 'BTT');

--Check segment and block size
 SQL> select  
           bytes,   
           bytes/1024/1024 SIZEMB,   
           extents,   
           s.blocks,  
           t.num_rows,   
           t.last_analyzed,   
           t.blocks  
 from dba_segments s, dba_tables t  
 where s.segment_name = t.table_name and segment_name='BTT';  

 BYTES,SIZEMB,EXTENTS,BLOCKS,NUM_ROWS,LAST_ANALYZED,BLOCKS_1  
 587202560,560,141,71680,16000000,14.10.2015 10:10:15,71377

Now delete rows
 delete from ulfet.btt;  
 commit; 

--Again take statistics
 EXEC DBMS_STATS.gather_table_stats('ULFET', 'BTT');

--Check again
 SQL> select  
           bytes,   
           bytes/1024/1024 SIZEMB,   
           extents,   
           s.blocks,  
           t.num_rows,   
           t.last_analyzed,   
           t.blocks  
 from dba_segments s, dba_tables t  
 where s.segment_name = t.table_name and segment_name='BTT';  

 BYTES,SIZEMB,EXTENTS,BLOCKS,NUM_ROWS,LAST_ANALYZED,BLOCKS_1  
 587202560,560,141,71680,0,14.10.2015 10:17:30,71377 

As you see extent not changed

Ulfet user has quota on two tablespaces
SQL> select   
     tablespace_name,   
     bytes,   
     bytes/1024/1024 SIZEMB,   
     blocks   
 from dba_ts_quotas   
 where username='ULFET';

 TABLESPACE_NAME,BYTES,SIZEMB,BLOCKS  
 DATA01,0,0,0  
 DATA001,624951296,596,76288  

--Move segment to another tablespace for shrink purpose
SQL> alter table ulfet.btt move tablespace DATA01;

Now check again
 SQL> select   
     tablespace_name,   
     bytes,   
     bytes/1024/1024 SIZEMB,   
     blocks   
 from dba_ts_quotas   
 where username='ULFET'; 

 TABLESPACE_NAME,BYTES,SIZEMB,BLOCKS  
 DATA01,65536,0,0625,8  
 DATA001,37748736,36,4608  

--Check segment size and extents
SQL> select  
           bytes,   
           bytes/1024/1024 SIZEMB,   
           extents,   
           s.blocks,  
           t.num_rows,   
           t.last_analyzed,   
           t.blocks  
 from dba_segments s, dba_tables t  
 where s.segment_name = t.table_name and segment_name='BTT'; 

 BYTES,SIZEMB,EXTENTS,BLOCKS,NUM_ROWS,LAST_ANALYZED,BLOCKS_1  
 65536,0,0625,1,8,0,14.10.2015 10:17:30,71377 

Comments

Popular posts from this blog

Rman encryption and other techniques

Today I will demonstrate Recovery Manager features, especially encryption and some other techniques. First of all let me note about RMAN backup encryption. Staring from Oracle 10g RMAN now creates encrypted backups that cannot be restored by unauthorized people. There are 3 modes of backup encryption: * Transparent encryption * Password encryption * Dual-mode encryption using either transparent or password encryption All RMAN backups are not encrypted but you can encrypt any RMAN backup in the form of a backup set. In this tutorial I will show you how to configure Password encryption. Let`s finish talking and start to demonstrate. check parameters with "SHOW ALL" command, by default encryption is OFF RMAN> show all; RMAN configuration parameters are: CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default CONFIGURE BACKUP OPTIMIZATION OFF; # default CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTR...

ORA-03206: maximum file size of (5242880) blocks in AUTOEXTEND clause is out of range

Today when I want to change max size of datafile I got strange error. ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/MYDB/users01.dbf' AUTOEXTEND ON NEXT 1280K MAXSIZE 32GB ORA-03206: maximum file size of (5242880) blocks in AUTOEXTEND clause is out of range Here is reason: The maximum file size for an autoextendable file has exceeded the maximum number of blocks allowed. After research internet I found that instead of using 32GB we can use 32767M. (same values but in MB). Or you may use 31GB too. ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/MYDB/users01.dbf' AUTOEXTEND ON NEXT 1280K MAXSIZE 32767M;

Fix ORA-01139: RESETLOGS option only valid after an incomplete database recovery

While shutting down my TEST database process was hanged. Then I had to use shutdown abort. But when I wanted to start database it did not open. SQL> select name from v$database; NAME --------- TEST SQL> shut abort; ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 6597406720 bytes Fixed Size 2265664 bytes Variable Size 3204451776 bytes Database Buffers 3372220416 bytes Redo Buffers 18468864 bytes Database mounted. SQL> alter database open; alter database open * ERROR at line 1: ORA-03113: end-of-file on communication channel Process ID: 6552 Session ID: 191 Serial number: 3  What`s wrong?  SQL> alter database open resetlogs; ERROR:    ORA-03114: not connected to ORACLE    SQL> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Pr...