2010-09-06 55 views
1

这是我的代码优化代码:LINQ和foreach循环15K记录

​​

基本上,从另一台服务器通过一些方法填补了InstellingGegevens表武功。 然后我需要做的是检查这个表中是否有新记录,并在Instellingens中填写新记录。

此代码在15k条记录上运行时间为4分钟。我如何优化它?或者是存储过程的唯一途径?

此代码在计时器中运行,每6小时运行一次。如果一个存储过程是最好的,如何在计时器中使用它?你可以优化这个

 Timer Tim = new Timer(21600000); //6u 
     Tim.Elapsed += new ElapsedEventHandler(fixInstellingenTabel); 
     Tim.Start(); 

回答

3

在存储过程中这样做会快得多。我们做了一些非常相似的事情,表中只有大约10万个项目,每五分钟更新一次,并且有更多的领域。我们的工作需要大约两分钟的时间才能完成,然后它会在三个数据库的几个表中进行更新,因此您的工作只需要几秒钟。

你需要将只是像查询:

create procedure UpdateInstellingens as 

insert into Instellingens (
    INST_LOC_REF, INST_LOCNR, INST_REF, INST_TYPE, Opt_KalStandaard 
) 
select q.INST_LOC_REF, q.INST_LOCNR, q.INST_REF, q.INST_TYPE, cast(0 as bit) 
from InstellingGeven q 
left join Instellingens i 
    on q.INST_LOC_REF = i.INST_LOC_REF and q.INST_LOCNR = i.INST_LOCNR 
    and q.INST_REF = i.INST_REF and q.INST_TYPE = i.INST_TYPE 
where i.INST_LOC_REF is null 

您可以在SQL服务器运行作业的程序,不涉及任何应用程序在所有的,或者您可以使用ADO.NET来执行程序从你的计时器。

+0

这段代码很棒。它在不到一秒的时间内运行15k条记录。我想了半秒。惊人的速度:)你能解释一下这个查询的工作原理吗?因为我不明白它是正确的。是这样吗?:插入表格中,从instellinGegevens中选择4个项目,其中inst_loc_ref为空。我没有得到左连接的功能。为什么当你加入这两个表时,它不会给出错误,当其中一个表没有相应的值时。 – Stefanvds 2010-09-06 14:30:18

+0

编辑:好的我得到了左连接。辉煌的想法:)谢谢! http://www.w3schools.com/sql/sql_join_left.asp – Stefanvds 2010-09-06 14:35:55

2

一种方式是通过改变Count(...) <= 0Any()。然而,一个更好的优化将检索单个查询此信息外循环:

var instellingens = _db.Instellingens 
    .Select(q => new { q.INST_LOC_REF, q.INST_LOCNR, q.INST_REF, q.INST_TYPE }) 
    .Distinct() 
    .ToDictionary(q => q, q => true); 

(关于第二个想法,一个HashSet是最合适的位置,但不幸的是没有ToHashSet()扩展方法如果你喜欢,你可以写你自己的)

然后你的循环中:

if (instellingens.ContainsKey(new { q.INST_LOC_REF, q.INST_LOCNR, 
            q.INST_REF, q.INST_TYPE })) { 
    // There is no item yet. Create one. 
    // ... 
} 

然后,你可以通过使LA优化循环本身zy-retrieve:

// No need for the List<InstellingGegeven> 
foreach (InstellingGegeven i in _db.InstellingGegevens) { 
    // ... 
} 
+0

+1。显然,Netagitve方面是内存消耗增加。不是真正的负面因素,除非这个因素变得至关重要 - 所以它不会阻止我的+1。 – TomTom 2010-09-06 14:08:42

1

Guffa说了什么,但如果使用Linq在这里并不是最好的课程,与其他ORM一样,Linq牺牲了可用性的性能。对于典型的应用程序执行路径,这通常是一个很好的折衷。另一方面,SQL非常擅长基于集合的操作,所以真的是在这里飞行的方式。