Showing posts with label Bytes. Show all posts
Showing posts with label Bytes. Show all posts

Wednesday, June 22, 2011

Space Requirement for Oracle Data

The simple test below tells that 1 Character of data needs approx 1.25 Bytes of disk space in Oracle.

SQL>DEFINE n1 = 100000
SQL>DROP TABLE tsize;

Table dropped.
SQL>CREATE TABLE tsize ( v1 VARCHAR2(100), n1 NUMBER(15), d1 DATE, v2 VARCHAR2(10));
Table created.
SQL>
SQL>DECLARE
  2     lv_count NUMBER;
  3  BEGIN
  4     lv_count := &n1;
  5     FOR i IN 1..lv_count
  6     LOOP
  7        INSERT INTO tsize(v1,n1,d1,v2)
  8           VALUES ( 'This Is a String of 100 Characters Length.This Is a String of 100 Characters
 Length.This Is a String'
  9                    ,123456789012345
 10                    ,SYSDATE
 11                    ,'This  Test'
 12                  );
 13     END LOOP;
 14     COMMIT;
 15  END;
 16  /
old   4:    lv_count := &n1;
new   4:    lv_count := 100000;

PL/SQL procedure successfully completed.
SQL>
SQL>ANALYZE TABLE TSIZE COMPUTE STATISTICS;

Table analyzed.
SQL>
SQL>SELECT AVG_ROW_LEN FROM USER_TABLES WHERE TABLE_NAME = 'TSIZE';

AVG_ROW_LEN
-----------
        133

SQL>
SQL>SELECT BYTES/1024/1024 size_in_mb FROM dba_segments WHERE segment_name = 'TSIZE';

SIZE_IN_MB
----------
        16

SQL>
SQL>SELECT bytes/(avg_row_len*&n1)  size_per_char_bytes
  2    FROM user_tables         ut
  3        ,dba_segments        ds
  4   WHERE ds.segment_name     = ut.table_name
  5     AND ut.table_name       = 'TSIZE' ;    
old   1: SELECT bytes/(avg_row_len*&n1)  size_per_char_bytes
new   1: SELECT bytes/(avg_row_len*100000)  size_per_char_bytes

SIZE_PER_CHAR_BYTES
-------------------
         1.26144481
        
/*******************************************************************************************/
SQL>DEFINE n1 = 100000
SQL>DROP TABLE tsize;

Table dropped.
SQL>CREATE TABLE tsize ( v1 VARCHAR2(100), v2 VARCHAR2(100), v3 VARCHAR2(100), v4 VARCHAR2(100));
Table created.
SQL>
SQL>BEGIN
  2     FOR i IN 1..100000
  3     LOOP
  4        INSERT INTO tsize(v1) VALUES('This Is a String of 100 Characters Length.This Is a String
of 100 Characters Length.This Is a String');
  5     END LOOP;
  6     COMMIT;
  7  END;
  8  /

PL/SQL procedure successfully completed.
SQL>SELECT BYTES/1024/1024 size_in_mb FROM dba_segments WHERE segment_name = 'TSIZE';
SIZE_IN_MB
----------
        12

SQL>
SQL>UPDATE tsize
  2     SET v2 = v1;

100000 rows updated.
SQL>
SQL>UPDATE tsize
  2     SET v3 = v1;

100000 rows updated.
SQL>
SQL>SELECT BYTES/1024/1024 size_in_mb FROM dba_segments WHERE segment_name = 'TSIZE';  

SIZE_IN_MB
----------
        36

SQL>
SQL>UPDATE tsize
  2    SET v4 = v1;

100000 rows updated.
SQL>
SQL>SELECT BYTES/1024/1024 size_in_mb FROM dba_segments WHERE segment_name = 'TSIZE';  

SIZE_IN_MB
----------
        47

SQL>
SQL>ANALYZE TABLE TSIZE COMPUTE STATISTICS;

Table analyzed.
SQL>
SQL>SELECT bytes/(avg_row_len*&n1)  size_per_char_bytes
  2     FROM user_tables         ut
  3         ,dba_segments        ds
  4    WHERE ds.segment_name     = ut.table_name
  5      AND ut.table_name       = 'TSIZE' ;      
old   1: SELECT bytes/(avg_row_len*&n1)  size_per_char_bytes
new   1: SELECT bytes/(avg_row_len*100000)  size_per_char_bytes

SIZE_PER_CHAR_BYTES
-------------------
         1.19910151
/*************************************************************************************/