今天到公司之後,就收到客戶的郵件,他們提供了一個清單,希望我們能夠們配合提供一份比較詳細的報告,得到某個表在生産環境中所占的空間大小,他們需要根據這些資訊來分析一個需求做相應的處理,這個問題處理起來還是很容易的,感覺分分鐘搞定,但是自己去檢視的時候,發現還是要考慮一些細節,
比如這個表如果是分區表,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