前天在做数据库割接预演的时候遇到一个比较棘手的问题。
我将老库的一张5000W级数据量的表 用  insert .....select 的方式导入到新表(不能用IMP导入,因为我导入的时候需要改一些数据)时候竟然执行了 20个小时没倒完, 我还倒了一个和这个表一样的数据量,表结构也一样 ,用的语句也一样表空间也一样的的表 这个导入只用了48分钟。  这是怎么回事?
在导入表的时候因为很慢  我怀疑是表被锁了,可是没有查询到该表被锁的信息。 我对这个表进行for update、截断、 delete 都说 资源正忙 ,  我间隔时间查看表空间,表空间占用量根本没有变化      我只有让我们数据库管理员把  我执行的语句给杀掉 。
两张表完全相同为什么 一个可以导入,一个导不了呢? 
各位大侠  给指点一下吧。估计是那块出的毛病,要是数据库服务器出的毛病,我估计也管不了了。

解决方案 »

  1.   

    1. 导入时,先将索引disable, insert select , 再启用索引2. insert select , 指定append.  假如是unarchive模式,可以指定 nologging3. 若回滚段不足,可以采取分段提交的方式。
      

  2.   

    若回滚段不足,可以采取分段提交的方式,这个是应该怎么设置,或者怎么操作?
    insert select , 指定append. 假如是unarchive模式,可以指定 nologging这个不明白,给指点一下吧。
    对了 我用的是服务器端是oracle  9i 我在倒表前  新表的索引都删了  老表是有索引的。我倒的两张表都是这么倒的就一个成功一个没反应
    回滚段不足 会造成锁表么? 还是这条语句一直等待着可用的资源?
    谢谢了
      

  3.   

    ----------------------------. comcfgsqlplus -s ${NEWUSER}/${NEWPASS}@${NEWSID}<<!insert into dchnrescardinfo0001(card_no,res_code,group_id,prov_code,in_group,in_price,in_time,in_accept,pass_word
    ,start_time,expire_time,use_phone,use_money,desc_mode,status_code,is_active,sale_price,sale_code,op_accept,op_login
    ,op_time,op_code,note)
    select t.valcardnum,b.res_code,nvl(a.group_id,'10031'),'********','10031',0,sysdate,0,'null'
    ,sysdate,t.expdate,'null',0,'********',c.new_status,decode(STAND,'0','0','1','1','2','1','3','1','4','2','x'),nvl(t.valprice,0)/100.0,'10',0,'system'
    ,nvl(t.optdate,sysdate),'****',t.re
    from info.T_RS_ZCOMMONVALCARD_a  t,tran.comp_groupid a,schnrescode b,pResStatusRel c
    where t.rescodeid=b.res_code and t.orgcode=a.orgcode(+)
    and t.usestat=c.old_status
    and c.type='10'
    and  (( T.USESTAT <> '2') OR  
    ( T.USESTAT = '2' AND T.OPTDATE > TO_DATE('20090101','YYYYMMDD')));commit;                                                                                                                                            
    /                                                                                                                               !echo `${DATE_FORMAT}` `${TIME_FORMAT}`${SHELL_NAME} ${1} END---------------------------------------------------------------这是我的shell脚本 连个脚本都一样的 只是一个表是dchnrescardinfo0001 一个表是dchnrescardinfo0002