查看了一下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';
3.计算
SQL> select avg_row_len from user_tables where table_name='T';
AVG_ROW_LEN
-----------
98
SQL> select segment_name,segment_type,bytes from user_segments where segment_name in('T','T_IND');
SEGMENT_NAME SEGMENT_TYPE BYTES
--------------------------------------------------------------------------------- ------------------ ----------
T TABLE 9437184
T_IND INDEX 2097152
SQL> select trunc((2097152/9437184)*100) ind_pct from dual;
IND_PCT
----------
22