zoukankan      html  css  js  c++  java
  • oracle 一个稍微大点数据库

    公司有个水电收费系统,在包头试运行, 给了我一个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和索引


  • 相关阅读:
    nginx中root和alias的区别
    linux修改服务时间
    nginx.conf属性
    mybatis批量操作
    linux查看日志关键字搜索
    项目启动报错Caused by: java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.ImageFormatException
    springboot打包忽略Test
    mybatis文档
    On Java 8
    zabbix如何修改web字体
  • 原文地址:https://www.cnblogs.com/wangduqiang/p/4180957.html
Copyright © 2011-2022 走看看