2009-01-01 54 views
1

我有一个表中有大约一百万条记录。使用C#优化向SQL Server 2005的数据导入

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

A C#命令行程序正在处理这个新数据的导入,所以现在有1/2的百万select语句 - 每个记录。然后,生成一堆(大约一千万)插入和更新语句,并针对数据库运行。

这对本约6小时到我的工作站上运行。你对如何加速它有什么想法吗?我需要运行这些大型进口中的大约60个,以使数据库达到当前月份,然后每月加载一次新数据。

我觉得可以改进的一个领域是1/2百万select语句。也许我可以发出一个select语句来获取所有行,并将它们存储在内存中,然后对其进行搜索。我可以为此使用一个List,还是有更好的课程?我将不得不基于两个属性(或数据库字段)进行搜索。

回答

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) 

如果您的事务日志创建交易过大的一个刀片,把它分解成小块

2

看看.NET Framework 2.0中的SqlBulkCopy类。

MSDN Ref

+0

谢谢,我会仔细研究一下,我总是在BCL中找到新的东西,不知道重新编写所有的LINQ到SQL来查询和插入是值得的,但是如果我想要更好的表现。 – 2009-01-01 00:31:32