繁体   English   中英

使用SQL CE / LINQ进行批量操作

[英]Bulk Operations with SQL CE / LINQ

我正在尝试编写一个程序,以将大量数据从旧版SQL Express系统转换为基于SQL CE的较新系统。 以下是发生的情况的快速快照:

  • SQL Express安装中的大多数表都很小(<1万条记录)
  • 一张桌子非常大,记录超过一百万

对于较小的表,我可以使用LINQ很好-但是较大的表给我带来了问题。 标准方式:

foreach(var dataRow in ...) 
{ 
    table.InsertOnSubmit(dataRow); 
}

database.SubmitChanges();

非常缓慢,需要几个小时才能完成。 我什至尝试执行一些简单的“批量”操作来尝试消除循环末尾的一个巨大插入,即:

foreach(var dataRow in ...)
{
   if(count == BULK_LIMIT)
   {
      count = 0;
      database.SubmitChanges(); 
   }

   count++;       
   table.InsertOnSubmit(dataRow);
}

// Final submit, to catch the last BULK_LIMIT item block
database.SubmitChanges();

我尝试了各种散装尺寸,从相对较小的值(如1K-5K)到较大的尺寸(最大为300K)。

最终,我陷入了困境,无论批量大小如何,该过程花费的时间大致相同(几个小时)。

所以-有人知道提高速度的方法吗? 典型的解决方案是使用SqlBulkCopy,但这与SQL CE不兼容。

一些注意事项:

  • 是的,我确实想要SQL CE中的所有记录,是的,我已经设置了连接以使数据库最大容量为4 GB。
  • 是的,我确实确实需要1M +记录中的每条记录。
  • 每个数据行中的内容都是原始的,是字符串和时间戳的混合。
  • 旧版SQL Express数据库的大小约为400 MB。

在此先感谢-感谢您的帮助!

-丹

使用参数化的INSERT语句:准备命令,在循环中设置参数值,并对每个INSERT重用同一命令。

执行所有INSERT后,请删除所有索引并重新应用。

更新 :Chris Tacke在这里使用SqlCeResultset具有最快的解决方案: SQLCE中的批量插入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM