Jak Obliczyć Rzeczywisty Rozmiar Tabeli?
Ten wpis dotyczy wyliczenia rzeczywistego rozmiaru danych przechowywanych w tabeli w bazach danych Oracle.
CREATE TABLE t1 (id NUMBER NOT NULL, name CHAR(2000) DEFAULT 'A') / INSERT INTO t1 (id) values (3) / ANALYZE TABLE t1 COMPUTE STATISTICS; COMPUTE SUM OF BLOCKS ON REPORT; BREAK ON REPORT; SELECT t.num_rows, t.blocks, t.empty_blocks, t.avg_space, t.avg_row_len, t.num_freelist_blocks, s.blocks AS segment_blocks, s.bytes FROM dba_tables t, dba_segments s WHERE t.owner = s.owner AND t.table_name = s.segment_name AND t.owner = USER AND t.table_name = 'T1' / CLEAR BREAKS
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN SEGMENT_BLOCKS BYTES
-------- ------ ------------ --------- ----------- -------------- -----
1 5 3 15863 2009 8 131072
Analizując powyższe widać, że do przechowywania tabeli T1 z jednym rekordem potrzebujemy 8 bloków segmentu, z czego 5 bloków przechowują jakiekolwiek dane. Każdy z tych bloków jest wypełniony tylko w niewielkim ułamku, co widać w kolumnie AVG_SPACE. Tyle przestrzeni w bloku jest pusta. Szybko wyliczając 16384 – 15863 = 521. Uśredniając, w każdym z pięciu bloków siedzi 521 bajtów danych.
Idąc tym tropem rzeczywistą zajętość miejsca przez tabelę można wyliczyć z poniższego wzoru, gdzie db_block_size to rozmiar bloku ustawiony na bazie w v$parameter:
(db_block_size – avg_space) * blocks
Podstawiając do wzoru
(16384 – 15863) * 5 = 2605 bajtów