Finding object size in Oracle database
Ref:
http://www.runningoracle.com/product_info.php?cPath=2_44&products_id=153
Finding object size in Oracle database is very important and common. Is it very useful to know the exact size occupied by the object at the tablespace. The object size in the following scripts is in Mbytes. The scripts have been formatted to work very easily with TOAD SQL Editor. For example you can filter with tablespace_name, or owner, or size (for example more than 1GByte)
SELECT owner, segment_name, segment_type, partition_name, ROUND(bytes/(1024*1024),2) SIZE_MB, tablespace_name
FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION',
'INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION', 'TEMPORARY')
--AND TABLESPACE_NAME LIKE 'COSTE%'
--AND SEGMENT_NAME LIKE 'P2010201%'
--AND partition_name LIKE 'P20100201%'
--AND segment_type = 'TABLE'
--AND OWNER = 'TARGET_POC'
--AND ROUND(bytes/(1024*1024),2) > 1000
ORDER BY bytes DESC;
You can group by tablespace, owner and segment type and see the total space occupied in MBytes
SELECT tablespace_name, owner, segment_type "Object Type",
COUNT(owner) "Number of Objects",
ROUND(SUM(bytes) / 1024 / 1024, 2) "Total Size in MB"
FROM sys.dba_segments
WHERE tablespace_name IN ('MPIS')
GROUP BY tablespace_name, owner, segment_type
ORDER BY tablespace_name, owner, segment_type;
Database size history
Summary
Faster query!(all the files, data and temp)
SELECT SUM(MB_ALLOC)/1024 GB_DB_SIZE FROM
(SELECT SUM(ROUND(bytes_used/(1024*1024),2) + ROUND(bytes_free/(1024*1024),2)) MB_ALLOC
FROM V$temp_space_header, dba_temp_files
WHERE V$temp_space_header.file_id (+) = dba_temp_files.file_id
UNION
SELECT SUM(BYTES)/(1024*1024) MB_ALLOC FROM dba_data_files);
Slower query
SELECT ROUND(SUM(USED.BYTES) / 1024 / 1024 / 1024 ) || ' GB' "Database Size"
, ROUND(SUM(USED.BYTES) / 1024 / 1024 / 1024 ) -
ROUND(FREE.P / 1024 / 1024 / 1024) || ' GB' "Used space"
, ROUND(FREE.P / 1024 / 1024 / 1024) || ' GB' "Free space"
FROM (SELECT BYTES
FROM V$DATAFILE
UNION ALL
SELECT BYTES
FROM V$TEMPFILE
UNION ALL
SELECT BYTES
FROM V$LOG) USED
, (SELECT SUM(BYTES) AS P
FROM DBA_FREE_SPACE) FREE
GROUP BY FREE.P;
To keep a history of how database is growing you can create a table that records for example every week the database size. The following procedure does not take into account the UNDO tablespace and TEMPORARY tablespace, only real data and indexes.
Create the table for database size history
create table db_space_hist (
timestamp date,
total_space number(8),
used_space number(8),
free_space number(8),
pct_inuse number(5,2),
num_db_files number(5)
);
Create the procedure db_space_history
CREATE OR REPLACE PROCEDURE db_space_history AS
BEGIN
INSERT INTO db_space_hist
SELECT SYSDATE, total_space,
total_space-NVL(free_space,0) used_space,
NVL(free_space,0) free_space,
((total_space - NVL(free_space,0)) / total_space)*100 pct_inuse,
num_db_files
FROM ( SELECT SUM(bytes)/1024/1024 free_space
FROM sys.DBA_FREE_SPACE WHERE tablespace_name NOT LIKE '%UNDO%') FREE,
( SELECT SUM(bytes)/1024/1024 total_space,
COUNT(*) num_db_files
FROM sys.DBA_DATA_FILES WHERE tablespace_name NOT LIKE '%UNDO%') FULL;
COMMIT;
END;
/
Create the job that runs once in a week
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
(
job => X
,what => 'SYS.DB_SPACE_HISTORY;'
,next_date => TO_DATE('22/02/2008 19:40:28','dd/mm/yyyy hh24:mi:ss')
,INTERVAL => 'TRUNC(SYSDATE+7)'
,no_parse => FALSE
);
END;
Monitor how things going on periodically:
select * from db_space_hist order by timestamp desc;
Alternative:How the database size increased in GBytes per month for the last year.
SELECT TO_CHAR(creation_time, 'RRRR Month') "Month",
round(SUM(bytes)/1024/1024/1024) "Growth in GBytes"
FROM sys.v_$datafile
WHERE creation_time > SYSDATE-365
GROUP BY TO_CHAR(creation_time, 'RRRR Month');
Month Growth in GBytes
-------------- ----------------
2008 December 1331
2008 November 779
2008 October 447
2009 April 797
2009 August 344
2009 February 505
2009 January 443
2009 July 358
2009 June 650
2009 March 452
2009 May 1787
2009 October 255
2009 September 158
As you can see from the last query the database increased its size for the month: 2009 October 255 GBytes
Script to extract total objects & size of all Schema’s:
select obj.owner "Owner", obj_cnt "Objects",
decode(seg_size, NULL, 0, seg_size) "size MB"
from ( select owner, count(*) obj_cnt from dba_objects group by owner) obj,
( select owner, ceil(sum(bytes)/1024/1024) seg_size from dba_segments group by owner) segment
where obj.owner = segment.owner(+)
order by 3 desc, 2 desc, 1;
SQL> set pages 999
SQL> col "size MB" format 999,999,999
SQL> col "Objects" format 999,999,999
SQL> select obj.owner "Owner", obj_cnt "Objects", decode(seg_size, NULL, 0, seg_size) "size MB"
from (select owner, count(*) obj_cnt from dba_objects group by owner) obj
, (select owner, ceil(sum(bytes)/1024/1024) seg_size
from dba_segments group by owner) seg where obj.owner = seg.owner(+)
order by 3 desc ,2 desc, 1;
Database uptime
column hostname format a26
column “Instance Name” format a16
column “Started At” format a26
column “Database Uptime” format a52
SELECT
host_name as Hostname,
instance_name as “Instance Name”,
to_char(startup_time,’DD-MON-YYYY HH24:MI:SS’) as “Started_At”,
floor(sysdate – startup_time) || ‘ days(s) ‘ ||
trunc( 24*((sysdate-startup_time) -
trunc(sysdate-startup_time))) || ‘ hour(s) ‘ ||
mod(trunc(1440*((sysdate-startup_time) -
trunc(sysdate-startup_time))), 60) ||’ minute(s) ‘ ||
mod(trunc(86400*((sysdate-startup_time) -
trunc(sysdate-startup_time))), 60) ||’ seconds’ as “Database_Uptime”
FROM
sys.v_$instance;
http://www.runningoracle.com/product_info.php?cPath=2_44&products_id=153
Finding object size in Oracle database is very important and common. Is it very useful to know the exact size occupied by the object at the tablespace. The object size in the following scripts is in Mbytes. The scripts have been formatted to work very easily with TOAD SQL Editor. For example you can filter with tablespace_name, or owner, or size (for example more than 1GByte)
SELECT owner, segment_name, segment_type, partition_name, ROUND(bytes/(1024*1024),2) SIZE_MB, tablespace_name
FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION',
'INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION', 'TEMPORARY')
--AND TABLESPACE_NAME LIKE 'COSTE%'
--AND SEGMENT_NAME LIKE 'P2010201%'
--AND partition_name LIKE 'P20100201%'
--AND segment_type = 'TABLE'
--AND OWNER = 'TARGET_POC'
--AND ROUND(bytes/(1024*1024),2) > 1000
ORDER BY bytes DESC;
You can group by tablespace, owner and segment type and see the total space occupied in MBytes
SELECT tablespace_name, owner, segment_type "Object Type",
COUNT(owner) "Number of Objects",
ROUND(SUM(bytes) / 1024 / 1024, 2) "Total Size in MB"
FROM sys.dba_segments
WHERE tablespace_name IN ('MPIS')
GROUP BY tablespace_name, owner, segment_type
ORDER BY tablespace_name, owner, segment_type;
Database size history
Summary
Faster query!(all the files, data and temp)
SELECT SUM(MB_ALLOC)/1024 GB_DB_SIZE FROM
(SELECT SUM(ROUND(bytes_used/(1024*1024),2) + ROUND(bytes_free/(1024*1024),2)) MB_ALLOC
FROM V$temp_space_header, dba_temp_files
WHERE V$temp_space_header.file_id (+) = dba_temp_files.file_id
UNION
SELECT SUM(BYTES)/(1024*1024) MB_ALLOC FROM dba_data_files);
Slower query
SELECT ROUND(SUM(USED.BYTES) / 1024 / 1024 / 1024 ) || ' GB' "Database Size"
, ROUND(SUM(USED.BYTES) / 1024 / 1024 / 1024 ) -
ROUND(FREE.P / 1024 / 1024 / 1024) || ' GB' "Used space"
, ROUND(FREE.P / 1024 / 1024 / 1024) || ' GB' "Free space"
FROM (SELECT BYTES
FROM V$DATAFILE
UNION ALL
SELECT BYTES
FROM V$TEMPFILE
UNION ALL
SELECT BYTES
FROM V$LOG) USED
, (SELECT SUM(BYTES) AS P
FROM DBA_FREE_SPACE) FREE
GROUP BY FREE.P;
To keep a history of how database is growing you can create a table that records for example every week the database size. The following procedure does not take into account the UNDO tablespace and TEMPORARY tablespace, only real data and indexes.
Create the table for database size history
create table db_space_hist (
timestamp date,
total_space number(8),
used_space number(8),
free_space number(8),
pct_inuse number(5,2),
num_db_files number(5)
);
Create the procedure db_space_history
CREATE OR REPLACE PROCEDURE db_space_history AS
BEGIN
INSERT INTO db_space_hist
SELECT SYSDATE, total_space,
total_space-NVL(free_space,0) used_space,
NVL(free_space,0) free_space,
((total_space - NVL(free_space,0)) / total_space)*100 pct_inuse,
num_db_files
FROM ( SELECT SUM(bytes)/1024/1024 free_space
FROM sys.DBA_FREE_SPACE WHERE tablespace_name NOT LIKE '%UNDO%') FREE,
( SELECT SUM(bytes)/1024/1024 total_space,
COUNT(*) num_db_files
FROM sys.DBA_DATA_FILES WHERE tablespace_name NOT LIKE '%UNDO%') FULL;
COMMIT;
END;
/
Create the job that runs once in a week
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
(
job => X
,what => 'SYS.DB_SPACE_HISTORY;'
,next_date => TO_DATE('22/02/2008 19:40:28','dd/mm/yyyy hh24:mi:ss')
,INTERVAL => 'TRUNC(SYSDATE+7)'
,no_parse => FALSE
);
END;
Monitor how things going on periodically:
select * from db_space_hist order by timestamp desc;
Alternative:How the database size increased in GBytes per month for the last year.
SELECT TO_CHAR(creation_time, 'RRRR Month') "Month",
round(SUM(bytes)/1024/1024/1024) "Growth in GBytes"
FROM sys.v_$datafile
WHERE creation_time > SYSDATE-365
GROUP BY TO_CHAR(creation_time, 'RRRR Month');
Month Growth in GBytes
-------------- ----------------
2008 December 1331
2008 November 779
2008 October 447
2009 April 797
2009 August 344
2009 February 505
2009 January 443
2009 July 358
2009 June 650
2009 March 452
2009 May 1787
2009 October 255
2009 September 158
As you can see from the last query the database increased its size for the month: 2009 October 255 GBytes
Script to extract total objects & size of all Schema’s:
select obj.owner "Owner", obj_cnt "Objects",
decode(seg_size, NULL, 0, seg_size) "size MB"
from ( select owner, count(*) obj_cnt from dba_objects group by owner) obj,
( select owner, ceil(sum(bytes)/1024/1024) seg_size from dba_segments group by owner) segment
where obj.owner = segment.owner(+)
order by 3 desc, 2 desc, 1;
SQL> set pages 999
SQL> col "size MB" format 999,999,999
SQL> col "Objects" format 999,999,999
SQL> select obj.owner "Owner", obj_cnt "Objects", decode(seg_size, NULL, 0, seg_size) "size MB"
from (select owner, count(*) obj_cnt from dba_objects group by owner) obj
, (select owner, ceil(sum(bytes)/1024/1024) seg_size
from dba_segments group by owner) seg where obj.owner = seg.owner(+)
order by 3 desc ,2 desc, 1;
Database uptime
column hostname format a26
column “Instance Name” format a16
column “Started At” format a26
column “Database Uptime” format a52
SELECT
host_name as Hostname,
instance_name as “Instance Name”,
to_char(startup_time,’DD-MON-YYYY HH24:MI:SS’) as “Started_At”,
floor(sysdate – startup_time) || ‘ days(s) ‘ ||
trunc( 24*((sysdate-startup_time) -
trunc(sysdate-startup_time))) || ‘ hour(s) ‘ ||
mod(trunc(1440*((sysdate-startup_time) -
trunc(sysdate-startup_time))), 60) ||’ minute(s) ‘ ||
mod(trunc(86400*((sysdate-startup_time) -
trunc(sysdate-startup_time))), 60) ||’ seconds’ as “Database_Uptime”
FROM
sys.v_$instance;
Comments
Post a Comment