通过shell脚本来统计段大小

今天到公司之后,就收到客户的邮件, 他们提供了一个列表,希望我们能够们配合提供一份比较详细的报告,得到某个表在生产环境中所占的空间大小,他们需要根据这些信息来分析一个需求做相应的处理,这个问题处理起来还是很容易的,感觉分分钟搞定,但是自己去查看的时候,发现还是要考虑一些细节,
比如这个表如果是分区表,segment_type就会为TABLE PARTITION,对应的Index的segment_type就为INDEX PARTITION,如果表中含有lob列,就会在有两个相应的段,一个是数据lob段,一个是索引lob段。
所以像下面这样的表结构情况,就会生成4个段了。
create table a_part (id number,name varchar2(100),status varchar2(10),content clob)
partition by range(id)
(
partition p1 values less than (10),
partition p2 values less than (50),
partition p3 values less than (100)
);

因为列表比较长,一个一个去查也太没水平了,磨刀不误砍柴工,我就索引写了个shell脚本,很快就得到了结果,而且对于信息的分析也更加详实。
shell脚本的内容如下:
sqlplus -s n1/n1 < set linesize 200
col segment_name format a25
set pages 50
set feedback off
set linesize 200
col table_name format a25
col segment_name format a25
 select s.segment_name table_name,
       s.segment_name,
       s.segment_type,
       sum(bytes) / 1024 / 1024 size_MB
  from user_segments s
 where segment_name = upper('$1')
   and segment_type in ('TABLE', 'TABLE PARTITION')
 group by s.segment_name, s.segment_type
union all
select l.table_name,s.segment_name, s.segment_type, sum(s.bytes)/1024/1024 size_MB
  from user_segments s, user_lobs l
 where s.segment_name = l.segment_name
   and l.table_name = upper('$1')
   and s.segment_type in ( 'LOB PARTITION')
   group by l.table_name, s.segment_name, s.segment_type
union all
 select s.segment_name table_name,
       s.segment_name,
       s.segment_type,
       sum(bytes) / 1024 / 1024 size_MB
  from user_segments s
 where segment_name segment_name in
       (select index_name from user_indexes where table_name = upper('$1'))
   and segment_type in ('INDEX', 'INDEX PARTITION')
 group by s.segment_name, s.segment_type;
EOF

脚本运行的结果如下:
TABLE_NAME                SEGMENT_NAME              SEGMENT_TYPE          SIZE_MB
------------------------- ------------------------- ------------------ ----------
A_PART                    A_PART                    TABLE PARTITION            11
                          SYS_LOB0000091627C00004$$ LOB PARTITION           .1875
                          SYS_IL0000091627C00004$$  INDEX PARTITION         .1875
                          IDX_A_PART                INDEX PARTITION            12
可以看到对于表A_PART,得到的段信息也是一目了然,如果需要统计多个维度的信息,稍作修改即可,还是比较方便的。
如果为非分区表,结果就相对简单很多,也是一目了然。
TABLE_NAME                SEGMENT_NAME              SEGMENT_TYPE          SIZE_MB
------------------------- ------------------------- ------------------ ----------
TEST                      TEST                      TABLE                       2
                          IDX_TEST                  INDEX                      .5


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1591996/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-1591996/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值