通過shell指令碼來統計段大小

jeanron100發表於2015-04-22
今天到公司之後,就收到客戶的郵件,他們提供了一個列表,希望我們能夠們配合提供一份比較詳細的報告,得到某個表在生產環境中所佔的空間大小,他們需要根據這些資訊來分析一個需求做相應的處理,這個問題處理起來還是很容易的,感覺分分鐘搞定,但是自己去檢視的時候,發現還是要考慮一些細節,
比如這個表如果是分割槽表,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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章