Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> Object Growth
Just wanted to share a script I use for managing object growth. Create the table and run the procedure once per day. I usually have an access report based of this kind of stuff that prints me a nice pretty picture. Hope it helps someone.
CREATE TABLE SEG_HIST (
owner VARCHAR2(30), segment_name VARCHAR2(81), partition_name VARCHAR2(30), segment_type VARCHAR2(17), tablespace_name VARCHAR2(30), start_date DATE DEFAULT TRUNC(SYSDATE), start_bytes NUMBER DEFAULT 0, last_bytes NUMBER DEFAULT 0, jan_bytes NUMBER DEFAULT 0, feb_bytes NUMBER DEFAULT 0, mar_bytes NUMBER DEFAULT 0, apr_bytes NUMBER DEFAULT 0, may_bytes NUMBER DEFAULT 0, jun_bytes NUMBER DEFAULT 0, jul_bytes NUMBER DEFAULT 0, aug_bytes NUMBER DEFAULT 0, sep_bytes NUMBER DEFAULT 0, oct_bytes NUMBER DEFAULT 0, nov_bytes NUMBER DEFAULT 0, dec_bytes NUMBER DEFAULT 0, updated DATE DEFAULT TRUNC(SYSDATE),CONSTRAINT pk_segment_stats PRIMARY KEY (owner, segment_name, partition_name, segment_type, tablespace_name)) /
CURSOR c_segments IS
SELECT * FROM dba_segments WHERE segment_type IN ('TABLE', 'INDEX') AND owner NOT IN ('SYS', 'SYSTEM') AND bytes >= 10*1024*1024; l_record SEG_HIST%ROWTYPE; l_mth NUMBER; l_new_record BOOLEAN; l_updated DATE := SYSDATE;
BEGIN FOR x IN c_segments LOOP
l_new_record := FALSE; BEGIN SELECT * INTO l_record FROM seg_hist WHERE owner = x.owner AND segment_name = x.segment_name AND partition_name = nvl(x.partition_name, 'NULL') AND segment_type = x.segment_type AND tablespace_name = x.tablespace_name FOR UPDATE; EXCEPTION WHEN NO_DATA_FOUND THEN l_new_record := TRUE; WHEN OTHERS THEN dbms_output.put_line(dbms_utility.format_error_stack); END;
IF l_new_record THEN
INSERT INTO seg_hist ( owner, segment_name, partition_name, segment_type, tablespace_name, start_bytes, last_bytes, updated) VALUES (x.owner, x.segment_name, NVL(x.partition_name, 'NULL'), x.segment_type, x.tablespace_name, x.bytes, x.bytes, l_updated);
ELSE l_mth := TO_NUMBER(TO_CHAR(SYSDATE, 'MM'));
IF l_mth = 1 THEN l_record.jan_bytes := l_record.jan_bytes +
(x.bytes-l_record.last_bytes);
l_record.feb_bytes := 0; ELSIF l_mth = 2 THEN l_record.feb_bytes := l_record.feb_bytes +
(x.bytes-l_record.last_bytes);
l_record.mar_bytes := 0; ELSIF l_mth = 3 THEN l_record.mar_bytes := l_record.mar_bytes +
(x.bytes-l_record.last_bytes);
l_record.apr_bytes := 0; ELSIF l_mth = 4 THEN l_record.apr_bytes := l_record.apr_bytes +
(x.bytes-l_record.last_bytes);
l_record.may_bytes := 0; ELSIF l_mth = 5 THEN l_record.may_bytes := l_record.may_bytes +
(x.bytes-l_record.last_bytes);
l_record.jun_bytes := 0; ELSIF l_mth = 6 THEN l_record.jun_bytes := l_record.jun_bytes +
(x.bytes-l_record.last_bytes);
l_record.jul_bytes := 0; ELSIF l_mth = 7 THEN l_record.jul_bytes := l_record.jul_bytes +
(x.bytes-l_record.last_bytes);
l_record.aug_bytes := 0; ELSIF l_mth = 8 THEN l_record.aug_bytes := l_record.aug_bytes +
(x.bytes-l_record.last_bytes);
l_record.sep_bytes := 0; ELSIF l_mth = 9 THEN l_record.sep_bytes := l_record.sep_bytes +
(x.bytes-l_record.last_bytes);
l_record.oct_bytes := 0; ELSIF l_mth = 10 THEN l_record.oct_bytes := l_record.oct_bytes +
(x.bytes-l_record.last_bytes);
l_record.nov_bytes := 0; ELSIF l_mth = 11 THEN l_record.nov_bytes := l_record.nov_bytes +
(x.bytes-l_record.last_bytes);
l_record.dec_bytes := 0; ELSIF l_mth = 12 THEN l_record.dec_bytes := l_record.dec_bytes +
(x.bytes-l_record.last_bytes);
l_record.jan_bytes := 0; END IF; UPDATE seg_hist SET last_bytes = x.bytes, jan_bytes = l_record.jan_bytes, feb_bytes = l_record.feb_bytes, mar_bytes = l_record.mar_bytes, apr_bytes = l_record.apr_bytes, may_bytes = l_record.may_bytes, jun_bytes = l_record.jun_bytes, jul_bytes = l_record.jul_bytes, aug_bytes = l_record.aug_bytes, sep_bytes = l_record.sep_bytes, oct_bytes = l_record.oct_bytes, nov_bytes = l_record.nov_bytes, dec_bytes = l_record.dec_bytes, updated = trunc(sysdate) WHERE owner = x.owner AND segment_name = x.segment_name AND partition_name = nvl(x.partition_name, 'NULL') AND segment_type = x.segment_type AND tablespace_name = x.tablespace_name;
END IF; END LOOP; DELETE FROM seg_hist WHERE updated < l_updated;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(dbms_utility.format_error_stack);
END;
/
-- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: Post, Ethan INET: epost_at_kcc.com Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 San Diego, California -- Public Internet access / Mailing Lists -------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-LReceived on Wed Sep 12 2001 - 20:40:24 CDT
(or the name of mailing list you want to be removed from). You may
also send the HELP command for other information (like subscribing).
![]() |
![]() |