日期:2014-05-16  浏览次数:20811 次

oracle 中如何将一张500万数据的表从一个库快速转移到另外一个库
   大家好,如题,因为优化需求的原因,目前需要处理的历史数据有500万左右,现在我需要在一张新表中生成500万的数

据,但是存储过程处理时由于关联比较复杂,在投产的时候要执行完这段程序测试了下需要近10个小时,而这个时间客户接受

不了,我自己也接受不了。所以我想在其它环境先生成这500万数据,在投产的时候直接将这500导进去。
 
可是目前发现导进去的速度一样慢,我这样做的,在测试环境将生产投产时应该生成的数据插进这个新表中,数据约500万,

执行完后将测试环境的这个表及其数据全导出来,然后投产的时候直接导进去。我测试的时候 导出的是sql脚本,然后我在其

它环境测试导入的时候发现还是一样慢,怎么回事呢?直接导入的话应该很快的呀?难道我的导入方式不对?

    
 
      我应该怎么做呢?大家有没有更好的办法?投产时间太长啦,谁也不可能守着,而且生产环境不能停这么久,顶多给我一个小时


      
------最佳解决方案--------------------
用expdp导出,导出时指定只导出这个表格,然后投产的时候用impdp导进去。
------其他解决方案--------------------
你说是导出成sql? 不应该导出成sql的,这样太慢了

把你的impdp脚本发上来看看?

另外,你的表导入之前先把索引,主键停了,导完后再重建主键索引,这样会快很多

还可以把表设置为nologging

如果表上面有触发器,也是一样道理,先停了
------其他解决方案--------------------
不要导成insert语句脚本,用exp,imp来导出导入。你导成insert语句,你执行insert语句是很慢的。
------其他解决方案--------------------
将数据库中的表table1 、table2导出
   exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)

将d:\daochu.dmp中的表table1 导入
imp system/manager@TEST  file=d:\daochu.dmp  tables=(table1)
------其他解决方案--------------------
引用:
用expdp导出,导出时指定只导出这个表格,然后投产的时候用impdp导进去。

导入导出的时候记得先把触发器,外键什么的都停掉,导完再开启,或者生产库没有建这张表
------其他解决方案--------------------
上边两位朋友,我就是这样做的,只是导入的时候发现很慢,一个小时才导了70万数据,有没有更好的方法呢
------其他解决方案--------------------
机器性能配置如何,
其次脚本如何的?
------其他解决方案--------------------
insert语句脚本很慢的,
触发器一定要禁了
主键索引到问题不大,其他索引最好也删除,导完重建。

还不行的话(肯定机器太差),你可以先导到另外的表名里,库里再转一次,时间总够啦!
------其他解决方案--------------------
主键也删除了是最好的咯
------其他解决方案--------------------
修改数据库缓存
------其他解决方案--------------------
如果表是分区表的话,可以使用分区交换技术
------其他解决方案--------------------
首先第一个问题是你用存储过程去处理这些数据时分析时,500万数据量,慢是肯定的。
但是让我疑问的是你用 用exp,imp来导出导入的脚本贴出来 是不是字段特别多,如果脚本全是insert语句的话,在加上你的字段也特别多,500万数据那肯定也相当慢。

建议你用sqlldr命令去导入,或者直接导入表数据。那样速度会很快。
------其他解决方案--------------------
一定要导入导出吗?如果可以的话,可以考虑建dblink,然后通过dblink直接把表及数据拉过来存放在临时表里面,然后在插入的需要的表里面