使用C#优化将数据导入SQL Server 2005

时间:2009-01-01 00:13:10

标签: c# sql-server sql-server-2005

我有一张桌子,里面有大约50万条记录。

每个月我们都会获得大约50万条进口记录。这些目前被推入数据库中的另一个表,但最终将直接从txt文件加载。对于这些新记录中的每一个,我必须确定我们是否已经拥有该记录,如果不记录,则需要插入。但是,如果我们确实有记录,则需要更新。这些更新的逻辑包含C#代码。

C#命令行程序正在处理这些新数据的导入,因此现在有一百万个选择语句 - 每个记录一个。然后,生成一堆(再大约一百万)插入和更新语句并对数据库运行。

在我的工作站上运行大约需要6个小时。你对如何加快它有什么想法吗?我需要运行大约60个这样的大型导入来使数据库达到当前月份,然后每月加载一次新数据。

我认为可以改进的一个领域是250万选择语句。也许我可以发出一个select语句来获取所有行,并将它们存储在内存中,然后进行搜索。我可以为此使用List,还是有更好的课程?我将不得不根据两个属性(或DB字段)进行搜索。

2 个答案:

答案 0 :(得分:2)

查看.NET Framework 2.0的SqlBulkCopy类。

MSDN Ref

答案 1 :(得分:1)

是的,将逻辑移动到单个存储过程,该过程将批量插入到临时表中(不进行日志记录,然后在两个单独的语句中处理临时表中的所有记录...所有记录的一个更新在desti表中确实存在,并且对于所有那些

的人都存在一个插入
   Update DestTable Set
       ColName = T.ColName,
       [repeat for all cols]
    From TmpTable T Join DestTable D On D.Pk = T.Pk

    Insert DestTable(ColList)
    Select [ColList]
    From TmpTable T
    Where Not Exists (Select * From DestTable
                      Where pk = T.Pk)

如果这会为您的事务日志创建过大的事务,请将其分解为更小的块