Oracle 估算資料庫大小的方法

roominess發表於2012-03-31

一.說明

            一網友問我將一個查詢的結果集存放到臨時表裡,如果估算臨時表的大小,當時想的方法是通過統計block來計算。後來想,此方法的操作性也不是很高。 最好是能在查詢操作執行之前就能估算出大小。

 

            檢視了一下ALL_TABLES 表,其中有個欄位:avg_row_len. 該值單位為bytes。 可以一句這個欄位來進行一個估算。

 

AVG_ROW_LEN*

NUMBER

 

Average length of a row in the table (in bytes)

 

http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/statviews_2117.htm#i1592091

 

            根據對錶大小的估算,進而可以估算出整個資料庫的大小。 在專案測試階段,可以根據所有物件進行估算,從而可以估算出系統上線以後資料庫的大小,根據這些資料可以規劃儲存。這裡要注意一點,要給備份留足儲存空間。 一般備份需要的空間是DB的2-3倍。 如果DB 是100G,那麼給備份的空間最好是200G以上。

 

根據dba_segments檢視可以檢視資料庫中佔用儲存空間的物件:

SYS@anqing2(rac2)> select distinctsegment_type from dba_segments;

 

SEGMENT_TYPE

------------------

LOBINDEX

INDEX PARTITION

TABLE PARTITION

NESTED TABLE

ROLLBACK

LOB PARTITION

LOBSEGMENT

INDEX

TABLE

CLUSTER

TYPE2 UNDO

 

11 rows selected.

 

這裡主要就是表和索引。把所有表和索引的大小估算出來,在相加就可以估算出DB的大小了。

 

 

二. 估算表的大小

表的大小=記錄數*平均欄位大小(avg_row_len)

 

Avg_row_len 可以通過如下SQL 查詢。 其單位為bytes。

SYS@anqing2(rac2)> selecttable_name,avg_row_len from all_tables where table_name='T1';

 

TABLE_NAME                     AVG_ROW_LEN

------------------------------ -----------

T1                                      93

 

如果T1 表未來估計為1000萬行,那麼其大小就是1000w*93bytes。

 

 

三.估算表上索引的大小

        All_indexes 檢視沒有all_tables 上的avg_row_len 欄位,不過我們可以通過檢視和表大小的一個比率進行估算。 表的大小我們可以估算出來,索引的大小可以通過這個比率進行估算。

 

SQL>create index idx_t1_created on t1(created)

SQL>exec dbms_stats.gather_table_stats('SYS','T1',cascade=>TRUE)

 

SYS@anqing2(rac2)> selectsegment_name,segment_type,bytes,blocks from dba_segments where segment_namein  ('T1','IDX_T1_CREATED');

 

SEGMENT_NAME    SEGMENT_TYPE            BYTES     BLOCKS

--------------- ---------------------------- ----------

T1              TABLE                 6291456        768

IDX_T1_CREATED  INDEX                 2097152        256

 

計算索引和表的比率:

SYS@anqing2(rac2)> select (2097152/6291456)*100,(256/768)*100 from dual;

 

(2097152/6291456)*100 (256/768)*100

--------------------- -------------

          33.3333333    33.3333333

 

從bytes 和 blocks 的比率是一樣,即索引是表的33%。 那麼如果估算表以後的大小是1000M,那麼對應的索引大小就是1000M*33%=330M。

 

把所有表和索引的大小加起來,就是整個資料庫大小的估算值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15880878/viewspace-720020/,如需轉載,請註明出處,否則將追究法律責任。

相關文章