Friday, April 17, 2015

How to estimate the size of a table in Oracle

REferences

selectsegment_name table_name,
sum(bytes)/(1024*1024) table_size_meg
from user_extents
where segment_type='TABLE'
and segment_name = '&table_name'
group by segment_name;

Read more on what all to remember while getting the size of a table. Click here

Create your own function for the purpose:

CREATE OR REPLACE FUNCTION get_table_size
(t_table_name VARCHAR2)RETURN NUMBER IS

l_size NUMBER;
BEGIN
SELECT sum(bytes)/(1024*1024)
INTO l_size
FROM
user_extents
WHERE
segment_type='TABLE'
AND segment_name = t_table_name;

RETURN l_size;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;

/

Example:
SELECT get_table_size('EMP') Table_Size from dual;

Result:
Table_Size
0.0625



SELECT
   owner
, table_name, TRUNC(sum(bytes)/1024/1024/1024) GBFROM
(SELECT segment_name table_name, owner, bytesFROM dba_segmentsWHERE segment_type in  ('TABLE','TABLE PARTITION')
UNION ALL
SELECT i.table_name, i.owner, s.bytesFROM dba_indexes i, dba_segments sWHERE s.segment_name = i.index_nameAND   s.owner = i.ownerAND   s.segment_type in ('INDEX','INDEX PARTITION')
UNION ALL
SELECT l.table_name, l.owner, s.bytesFROM dba_lobs l, dba_segments sWHERE s.segment_name = l.segment_nameAND   s.owner = l.ownerAND   s.segment_type IN ('LOBSEGMENT','LOB PARTITION')
UNION ALL
SELECT l.table_name, l.owner, s.bytesFROM dba_lobs l, dba_segments sWHERE s.segment_name = l.index_nameAND   s.owner = l.ownerAND   s.segment_type = 'LOBINDEX')
---WHERE owner in UPPER('&owner')
GROUP BY table_name, ownerHAVING SUM(bytes)/1024/1024 > 10  /* Ignore really small tables */
ORDER BY SUM(bytes) desc


-----------------------------Another Approach ----------------------------------------------
select partition_name,num_rows from dba_tab_partitions where table_name='TABLE_NAME';

select table_name, num_rows from DBA_TABLES where table_name = 'DOCUMENT_INDEX_VALUE';

select owner, table_name, round((num_rows*avg_row_len)/(1024*1024)) MB
from all_tables
where  table_name='DOCUMENT_INDEX_VALUE';