oracle估算表大小,Oracle估算表大小的小方法

查看了一下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。 把所有表和索引的大小加起来,就是整个数据库大小的估算值。

1.创建测试表和索引

SQL> create table t as select * from dba_objects;

Table created.

SQL> create index t_ind on t(object_id);

Index created.

2.收集统计信息

SQL> exec dbms_stats.gather_table_stats(user,'t',cascade=>true);

PL/SQL procedure successfully completed.

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

表大小=row_number*98 *(1+0.22) bytes

整理自《让Oracle跑的更快》谭怀远

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值