设为首页 收藏本站
查看: 676|回复: 0

[经验分享] Oracle 估算数据库大小的方法

[复制链接]

尚未签到

发表于 2016-7-27 07:48:39 | 显示全部楼层 |阅读模式
  
一.说明
  一网友问我将一个查询的结果集存放到临时表里,如果估算临时表的大小,当时想的方法是通过统计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。
  
  把所有表和索引的大小加起来,就是整个数据库大小的估算值。
  
  
  
  
  
  -------------------------------------------------------------------------------------------------------
  Blog: http://blog.csdn.net/tianlesoftware
  Weibo: http://weibo.com/tianlesoftware
  Email: dvd.dba@gmail.com
  DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)
  DBA 超级群:63306533(满); DBA4 群:83829929(满) DBA5群: 142216823(满)
  DBA6 群:158654907(满) DBA7 群:69087192(满)DBA8 群:172855474
  DBA 超级群2:151508914 DBA9群:102954821 聊天 群:40132017(满)
  --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249900-1-1.html 上篇帖子: 自学的Oracle数据库文档 1 下篇帖子: Oracle中如何删除重复数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表