最近做一个sqlserver数据库迁移到oracle数据库。
在oracle里面建好了表空间、表这些。用C#写了一个批量导入的工具。
开始,采用查询SQLserver里面表数据然后拼接SQL的这样执行,后面遇到clob这些类型的字段里面存了图片这些字符串非常长,生成一条SQL有几百kb的,由于oracle 的限制无法执行,就没有采用这样的方式了。后面采用了OracleParameter这样的方式来,由于需要批量导入,加上是oracle10g就只能用odpnet,这个就遇到了一个问题,导入一个表里面有几十万条数据,只用了几十秒钟,但是有几个表只有一两万数据,里面就几个字段,建了一个主键,导入非常慢一次批量导入只能500条要用接近3分钟,这样表全部导入过去需要一个多小时,如果批量1000那么表就会被锁。
请问有人知道这个咋个解决吗?

解决方案 »

  1.   

    不懂开发,开发部分掠过不提 数据库部分:
    1、主键是需要有个唯一索引来保证数据的唯一性的,所以,有索引的插入自然是会比没索引的要慢的,索引越多,性能下降会越明显。
    2、不知道批量提交1000条会锁表是什么意思?多线程插入?通常的DML操作,包含insert都会锁表的,但是这时候在表上加的锁是等级不太高的3#队列锁,3#锁之间是兼容的,也就是说,某张表可以允许多个会话同时操作表里的数据,只要不设计多个会话操作同一行数据,就不会出现锁等待,我想应该调查下插入1000条记录时候,你的会话在经历什么等待,可以获取SID之后,查询v$session.event字段得到,以作进一步的调查只用。