LINQ更新程序 - 最佳实践

时间:2010-07-15 07:19:20

标签: performance linq linq-to-sql data-access-layer

使用LINQ时,更新的最佳做法是什么:

  • 拥有实例化的db / facade 对象,并将所有更改提交给 记录一下吗?
  • 要拥有静态数据库/外观对象, 并逐个单元地提交更改?

现在我正处于一个项目中,记录的每个单元格都有自己的静态更新方法

public static void CellName(int id, int data)
{
     using (var scope = new someDataContext())
     {
          var TableName = scope. CellName.Single(v => v.ID == id);
          TableName.CellName = data;
          scope.SubmitChanges();
     }
}

然后可以按照通常的TableName.CellName = [something]方案将这些设置为业务对象中的属性。

但是我也完成了我们使用实例化db / facade类的项目。首先设置属性之类的新值,然后调用database.SubmitChanges()方法,然后对整个记录(或记录)进行更新。

从设计的角度来看,我更喜欢第一个选项 - 当设置属性时,更改是即时的,并且它被视为任何其他对象。但从技术角度来看,我怀疑通过批量更新可以获得性能。

我应该选择哪种方法 - 还是我应该考虑其他选择?

1 个答案:

答案 0 :(得分:1)

更新invidual单元效率极低。更新数据库的主要开销是实例化连接,发送&收到回复,并在表格中找到要更新的行。如果你更新每个单元格,那么你需要为每个单元格执行这些步骤 - 如果你每行更新一次,那么每行一次。

单独更新单元格相当于编写

之类的SQL
-- new command
UPDATE [Table] SET [Column1] = 'Value1' WHERE [Id] = 1
GO
-- new command
UPDATE [Table] SET [Column2] = 'Value2' WHERE [Id] = 1
GO
-- new command
UPDATE [Table] SET [Column3] = 'Value3' WHERE [Id] = 1
GO

其中命令是串行处理的,并且每个命令在执行前等待上一个命令完成。虽然这可能不会比一次更新整行慢得多,但可能更慢,并且肯定不会更快。

首选方法是一次更新所有属性,然后发送单个SQL命令。

UPDATE [Table] 
SET [Column1] = 'Value1', [Column2] = 'Value2', [Column3] = 'Value3'
WHERE [Id] = 1

涉及到一些步骤,如果你从物理上和实际上考虑它,那么它们都应该有意义。

首先,LINQ-to-SQL检索整行,以便您可以更新属性。 “每个单元格”或“每行”操作都需要执行此操作,因此需要相同的时间。

// the "Single" operator retrieves an entire row 
var TableName = scope.CellName.Single(v => v.ID == id);
var row = scope.MyTable.Single(v => v.Id == id); // more accurate description

-- sql looks something like this
SELECT TOP 1 * FROM [MyTable] WHERE [Id] = @id

这涉及

  • 编译查询
  • 打开连接/从池中检索连接
  • 将命令发送到SQL服务器
  • 收到SQL服务器的回复

与其他服务器通信可能需要几毫秒到几秒钟,具体取决于距离,性能,服务器负载等。

然后更新属性。

row.Column1 = data;

这仅仅需要一个周期。它是整个手术时间中不可估量的一小部分。

然后你提交更改。

scope.SubmitChanges();

-- sql looks like this
UPDATE [MyTable] SET /* set of columns to update */ WHERE [Id] = @id

这又涉及许多步骤

  • 编译查询
  • 将命令发送到SQL Server
  • 从SQL Server接收响应

没有任何关于单独更新单元的“瞬间” - 单元将在使用“每行”模式更新整行的同时更新。只是剩下的单元格将更长进行更新。

不仅如此,从问题的外观来看,您还将拥有数百种样板UpdateProperty方法。我以前从未见过或听说过这样的模式,但老实说这听起来很灾难 - 你发送的SQL命令多于必要的数量,并且你的数据库延迟乘以表中的列数。