通過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
比如這個表如果是分割槽表,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 <
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 統計子目錄大小的shell指令碼(轉)指令碼
- 通過shell指令碼分析足彩指令碼
- 通過shell指令碼來得到不穩定的執行計劃指令碼
- 通過shell指令碼生成資料統計資訊的報表指令碼
- 通過shell定製ash指令碼指令碼
- [ Shell ] 通過 Shell 指令碼匯出 CDL 網表指令碼
- 通過shell指令碼防止埠掃描指令碼
- 通過shell指令碼檢視鎖資訊指令碼
- 通過shell指令碼監控oracle session指令碼OracleSession
- 一段shell 指令碼指令碼
- [ Shell ] 通過 Shell 指令碼匯出 GDSII/OASIS 檔案指令碼
- 通過shell指令碼來檢視Undo中資源消耗高的sql指令碼SQL
- 通過shell指令碼 批量新增使用者指令碼
- 通過shell指令碼新增備庫日誌指令碼
- 通過shell指令碼檢視procedure的資訊指令碼
- 通過shell指令碼檢視package的資訊指令碼Package
- shell指令碼自動清理超過指定大小的檔案指令碼
- 通過shell指令碼批量操作mysql資料庫指令碼MySql資料庫
- 通過shell指令碼檢測MySQL服務資訊指令碼MySql
- 如何通過簡單的shell指令碼操作MongoDB指令碼MongoDB
- 通過shell指令碼快速定位active session問題指令碼Session
- 通過shell指令碼得到資料字典的資訊指令碼
- 透過shell指令碼來得到不穩定的執行計劃指令碼
- 《怎樣實現通過shell指令碼將使用者踢出系統》指令碼
- 通過shell指令碼監控sql執行頻率指令碼SQL
- 通過shell指令碼定位效能sql和生成報告指令碼SQL
- 透過shell指令碼生成資料統計資訊的報表指令碼
- 利用shell指令碼統計程式碼行數指令碼
- 使用shell指令碼巧妙統計檔案指令碼
- 通過shell指令碼得到資料庫的基本資訊(一)指令碼資料庫
- 通過shell指令碼監控日誌切換頻率指令碼
- 通過shell指令碼批量驗證dataguard的有效性指令碼
- 通過shell指令碼生成查詢表資料的sql指令碼SQL
- redis裡顯示key大小的shell指令碼Redis指令碼
- 透過shell指令碼分析足彩指令碼
- 巧用shell指令碼統計磁碟使用情況指令碼
- 《通過指令碼檢視哪些ip被佔用》shell筆記指令碼筆記
- 通過shell指令碼抓取awr報告中的問題sql指令碼SQL