公司有個水電收費系統,在包頭試運行, 給了我一個dmp讓熟悉一下業務.
dmp是壓縮過的.80多兆好像.解壓下300多兆好像.
導入, 有幾個表是50萬行的,幾個30萬左右,200多個表(沒數).很多表是0行,
設計居民用戶單位用戶一堆一堆的.用戶有幾萬個.?
問題是這樣的: 收費系統每個月要結算一個,但要測試這個流程的話要核算所有用戶,核算幾千個就花的時間很多,因為是自己的庫,所有我開始刪了.
先刪了大部分組織層次和網絡層次只剩一個.然后刪用戶檔案.所屬不是剩的一個的都刪了
select table_name,num_rows,owner from dba_tables where owner = 'WANG' order by num_rows?
這是看所有表的行數,開始哪個大刪刪哪個.順便說下dba_table不是實時的 ,準確來說一天也不更新一下.要,analyze table XXX compute statistics 來更新 xxx表的統計
涉及用戶信息的表 里 用戶id not in 用戶檔案都刪了. 記錄delete信息的表都truncate了(truncate無法回滾,delete可以,這個還要詳細說,涉及表空間的釋放)
表示刪了之后系統沒什么異常,核算10分鐘搞定,歸檔也很快. 之前的沒試,但只是一個部門的核算就10多分鐘好像,有好幾個部門呢.估計得幾個小時.
刪了很多東西就要想到delete的表空間釋放問題.
發現導出的話50兆左右.很好確實小了.導出的話好像就沒沒有的表空間的事了.
select ROUND(u.BYTES / (1024 * 1024), 2) MB from user_segments u where u.segment_name = 'S_YHFYMX_HISTORY' //表占用表空間的大小
//空間以段(segment)為單位分配給對象(如表、群集和索引)
這個是費用明細歷史.50多萬行,刪得好像剩一萬多行, 但占用的空間刪之前跟之后是一樣大的.
//?Select owner,segment_name,Sum(bytes)/1024/1024||'MB' as sizes ?From dba_extents ?HERE ?segment_name='TTT1' ?//這個也可以, 不知什么區別,這些特殊的表需要查下用途//TODO
但查了下資料.覺得并不必在意.就像某塊內存不使用了.但他內容不會清空(相當于修改了),只需標記為已刪就行,這樣他占用的空間就可以分配給別的程序. 別的程序用的時候就修改這個內存塊的內容.,只有修改內容只需一次 (刪除時候清空 算是一次多余的修改)
oracle的表空間管理 還涉及到高水標記的問題,?high?water?mark?
(高水標記除了truncate操作以外,只會增大,不會減小。雖然高水標記里的塊可能有空塊,這個塊也要被放到freelist中,但是這個塊只能被重用,也就是說它只能被這個表使用,而不能徹底釋放給別的數據對象使用)
怎么降低表空間占用,沒找到好的方法,這個方法是可以用的,先export 再drop表,在import.?
應該還有別的方法注意rowid和索引