想把一个库中的某些表迁移到另一个服务器上数据库中。
如何估计这些表所占用的物理空间的大小,有哪些要考虑的影响因素,谢谢。

解决方案 »

  1.   

      --表空间
    SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100, 2), '990.99') "使用比", F.TOTAL_BYTES "空闲空间(M)", F.MAX_BYTES "最大块(M)" 
    FROM 
    (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES 
    FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, 
    (SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB 
    FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D
     WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME ORDER BY F.TABLESPACE_NAME;--数据文件
    select 
    b.file_name 物理文件名,
    b.tablespace_name 表空间,
    b.bytes/1024/1024 大小M,
    (b.bytes-sum(nvl(a.bytes,0)))/1024/1024  已使用M,
    substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5)  利用率 
    from dba_free_space a,dba_data_files b 
    where a.file_id=b.file_id 
    group by b.tablespace_name,b.file_name,b.bytes 
    order by b.tablespace_name
      

  2.   

    select segment_name, bytes from dba_segments where owner = &USERNAME and segment_name = &tablename;
      

  3.   


    -- 表已用空间和分配空间的大小
    select * from table(dbms_space.object_space_usage_tbf('owner','tablename','TABLE',NULL));-- 索引已用空间和分配空间的大小
    select * from table(dbms_space.object_space_usage_tbf('owner','indexname','INDEX',NULL));
      

  4.   

    首先,按照表空间查询在绝大部分情况下是没有问题的,而且理论上移植过去的数据库只能比这个少不能比这个大,因为表空间运行过程中会产生很多碎片,导入导出时可以将碎片进行压缩,这些当然不是最重要的。如何查询表空间楼上已经有了答案,我这补充下我遇到过一些异常怪异的事情,以及其解决办法,因为ORACLE的BUG的确很多,理论上很多东西也未必是想要的,虽然这些解决办法可能不算办法,不过应该可以解决问题:1、目标数据库的块大小和原数据库的块大小不一致,此时可能会导致表空间的一些问题,我们当时搞定的方法就是弄成一样的,要么就做DB-LINK,将数据直接用移植过去,或者用COPY将数据复制过去。2、原数据库中有大量非常庞大的存储过程、包、包体,他们之间还相互调用,我们在一次ORACLE 10G的移植中遇到过一个用户下有14万行过程代码,其它用户差不多2万到6万不等,这可能算是某些情况下触发了ORACLE的BUG,具体我还没有细节原理和为什么还没有研究过,我们当时导出的时候就发现过程需要导半天才能倒出来(就单独的导那个用户,比所有的生产表花的时间还要长),当导入的时候发现表空间每秒以几十兆的速度向上飙升,而命令行下显示没有几条数据被导入;我当时没有尝试用压缩是否可以解决,不过我尝试了一个不是办法的办法,将表部分移植过去,过程部分全部用脚本,搞定了这件事情。