代码改变世界

oracle 一个稍微大点数据库

2014-12-23 19:14  wangduqiang  阅读(186)  评论(0编辑  收藏  举报
公司有个水电收费系统,在包头试运行, 给了我一个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和索引