C# Linq到SQL循环性能

C# Linq到SQL循环性能,c#,performance,linq-to-sql,C#,Performance,Linq To Sql,好的,我有一大堆复杂的逻辑需要反复研究。我正在调用一个web服务并返回结果。我获取结果并遍历它们,然后根据不同的规则进行不同的数据库调用 我使用的初始代码如下所示: foreach(var obj in MyObjects) { using(var connection = new LinqToSqlDBContext()) { connection.StoredProc1(obj.Name); connection.StoredProc2(obj

好的,我有一大堆复杂的逻辑需要反复研究。我正在调用一个web服务并返回结果。我获取结果并遍历它们,然后根据不同的规则进行不同的数据库调用

我使用的初始代码如下所示:

foreach(var obj in MyObjects)
{
    using(var connection = new LinqToSqlDBContext())
    {
        connection.StoredProc1(obj.Name);
        connection.StoredProc2(obj.Name);
        connection.SubmitChanges();
    }
}
我认为这样会更有效率:

using(var connection = new LinqToSqlDBContext())
{
    foreach(var obj in MyObjects)
    {
        connection.StoredProc1(obj.Name);
        connection.StoredProc2(obj.Name);       
    }
    connection.SubmitChanges();
}
有没有更好的方法来提高性能?我正在使用LINQtoSQL类和C#4.0


谢谢

是的,我认为2 one更好,因为您正在更新数据,只是在1 one中创建连接,而不是再次连接,这样会增加删除和获得与数据库连接的成本。

由于您正在调用存储过程,但不执行对象更改,
SubmitChanges()
是多余的。在正常使用中,我希望这
SubmitChanges
是一个重要的因素,因此平衡调用的数量和单个事务的大小是很重要的。但是,在这里不适用,所以我只使用:

using(var connection = new LinqToSqlDBContext())
{
    foreach(var obj in MyObjects)
    {
        connection.StoredProc1(obj.Name);
        connection.StoredProc2(obj.Name);       
    }
}

考虑通过使存储过程接受名称列表而不是一个名称来批处理在存储过程内执行的操作。这可以通过使用表值参数来实现。

一如既往-这取决于具体情况

在您的示例中,第一块代码运行存储过程,并在单独的事务中提交每个对象的更改

但是,第二块代码执行存储过程。。。然后在一次交易中一次性提交所有更改

这可能更有效,具体取决于您的应用程序

如果可以的话,最好是减少数据库调用的数量。因此,如果您可以重新编写存储过程,以获取一个名称列表而不是一个名称,然后在数据库服务器上执行循环,您很可能会看到性能的显著提高

请注意,实际上,打开和关闭连接的开销通常很小,因为它们通常缓存在连接池中。那么,

using(var connection = new LinqToSqlDBContext())
{
    foreach(var obj in MyObjects)
    {
        connection.StoredProc1(obj.Name);
        connection.StoredProc2(obj.Name);       
    }
}


很可能会非常相似。

事实上,您的问题与Linq2Sql无关,因为您使用的是存储过程。您可以尝试使用ado.net而不是datacontext来调用存储过程。也许这有一些性能优势,但我不确定

首先,由于您的两个存储过程具有相同的参数,因此可以将其合并到一个存储过程中,这样可能会再次占用一些开销

也要按照Jonas H所说的做:提供一个姓名列表,并给SP打一次电话


也许您可以通过在不同的线程中调用SP的all来进行并行处理,但这正是Marc Gravell可能会带来一些启发的地方?

由于连接池(在sql server中默认启用),开销是最小的
foreach(var obj in MyObjects)
{
    using(var connection = new LinqToSqlDBContext())
    {
        connection.StoredProc1(obj.Name);
        connection.StoredProc2(obj.Name);
    }
}