Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 优化代码:Linq和foreach循环15k记录_C#_Asp.net_Linq To Sql_Optimization_Timer - Fatal编程技术网

C# 优化代码:Linq和foreach循环15k记录

C# 优化代码:Linq和foreach循环15k记录,c#,asp.net,linq-to-sql,optimization,timer,C#,Asp.net,Linq To Sql,Optimization,Timer,这是我的密码 void fixInstellingenTabel(object source, ElapsedEventArgs e) { NASDataContext _db = new NASDataContext(); List<Instellingen> newOnes = new List<Instellingen>(); List<InstellingGegeven> li = _db.InstellingGegeven

这是我的密码

void fixInstellingenTabel(object source, ElapsedEventArgs e)
{
    NASDataContext _db = new NASDataContext();

    List<Instellingen> newOnes = new List<Instellingen>();

    List<InstellingGegeven> li = _db.InstellingGegevens.ToList();
    foreach (InstellingGegeven i in li) {
        if (_db.Instellingens.Count(q => q.INST_LOC_REF == i.INST_LOC_REF && q.INST_LOCNR == i.INST_LOCNR && q.INST_REF == i.INST_REF && q.INST_TYPE == i.INST_TYPE) <= 0) {
            // There is no item yet. Create one.
            Instellingen newInst = new Instellingen();
            newInst.INST_LOC_REF = i.INST_LOC_REF;
            newInst.INST_LOCNR = i.INST_LOCNR;
            newInst.INST_REF = i.INST_REF;
            newInst.INST_TYPE = i.INST_TYPE;
            newInst.Opt_KalStandaard = false;
            newOnes.Add(newInst);
        }
    }
    _db.Instellingens.InsertAllOnSubmit(newOnes);
    _db.SubmitChanges();
}

一种优化的方法是改变计数 一种优化的方法是改变计数 在存储过程中执行此操作会快得多。我们做了类似的事情,表中只有大约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 server中的作业运行该过程,而不涉及任何应用程序,也可以使用ADO.NET从计时器执行该过程。

在存储过程中执行此过程会快得多。我们做了类似的事情,表中只有大约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 server中的作业运行该过程,而不涉及任何应用程序,或者您可以使用ADO.NET从计时器执行该过程。

Guffa所说的,但是如果性能是您所追求的,那么在这里使用Linq并不是最好的方法。Linq和其他ORM一样,为了可用性牺牲了性能。对于典型的应用程序执行路径来说,这通常是一个很好的折衷方案。另一方面,SQL非常非常擅长基于集合的操作,因此这才是真正的解决方法。

Guffa说的,但是如果性能是您所追求的,那么在这里使用Linq并不是最好的方法。Linq和其他ORM一样,为了可用性牺牲了性能。对于典型的应用程序执行路径来说,这通常是一个很好的折衷方案。另一方面,SQL非常非常擅长基于集合的操作,因此这才是真正的解决方法。

+1。显然,NetGitve的另一个方面是内存消耗增加。不是真正的消极,除非这变得至关重要-因此它不会阻止我的+1.+1。显然,NetGitve的另一个方面是内存消耗增加。不是真正的消极,除非这变得至关重要-所以它不会阻止我的+1。这段代码非常棒。它在不到一秒钟的时间内运行了15k条记录。我想大约半秒钟。惊人的速度:你能解释一下这个查询是如何工作的吗?因为我不太明白。是这样吗?:插入表格,从InstellingeEvents中选择4项,其中inst_loc_ref为空。我不明白左撇子的意思。为什么当你连接这两个表时,当其中一个表没有相应的值时,它不会给出一个错误。编辑:好的,我得到左连接。聪明的想法:谢谢!这段代码太棒了。它在不到一秒钟的时间内运行了15k条记录。我想大约半秒钟。惊人的速度:你能解释一下这个查询是如何工作的吗?因为我不太明白。是这样吗?:插入表格,从InstellingeEvents中选择4项,其中inst_loc_ref为空。我不明白左撇子的意思。为什么当你连接这两个表时,当其中一个表没有相应的值时,它不会给出一个错误。编辑:好的,我得到左连接。聪明的想法:谢谢!
if (instellingens.ContainsKey(new { q.INST_LOC_REF, q.INST_LOCNR,
                                    q.INST_REF, q.INST_TYPE })) {
    // There is no item yet. Create one.
    // ...
}
// No need for the List<InstellingGegeven>
foreach (InstellingGegeven i in _db.InstellingGegevens) {
    // ...
}
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