天天看點

通過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

col table_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

 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,得到的段資訊也是一目了然,如果需要統計多個次元的資訊,稍作修改即可,還是比較友善的。

如果為非分區表,結果就相對簡單很多,也是一目了然。

TEST                      TEST                      TABLE                       2

                          IDX_TEST                  INDEX                      .5

上一篇: 讀書