使用LINQ时,更新的最佳做法是什么:
现在我正处于一个项目中,记录的每个单元格都有自己的静态更新方法
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()
方法,然后对整个记录(或记录)进行更新。
从设计的角度来看,我更喜欢第一个选项 - 当设置属性时,更改是即时的,并且它被视为任何其他对象。但从技术角度来看,我怀疑通过批量更新可以获得性能。
我应该选择哪种方法 - 还是我应该考虑其他选择?
答案 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
这涉及
与其他服务器通信可能需要几毫秒到几秒钟,具体取决于距离,性能,服务器负载等。
然后更新属性。
row.Column1 = data;
这仅仅需要一个周期。它是整个手术时间中不可估量的一小部分。
然后你提交更改。
scope.SubmitChanges();
-- sql looks like this
UPDATE [MyTable] SET /* set of columns to update */ WHERE [Id] = @id
这又涉及许多步骤
没有任何关于单独更新单元的“瞬间” - 单元将在使用“每行”模式更新整行的同时更新。只是剩下的单元格将更长进行更新。
不仅如此,从问题的外观来看,您还将拥有数百种样板UpdateProperty
方法。我以前从未见过或听说过这样的模式,但老实说这听起来很灾难 - 你发送的SQL命令多于必要的数量,并且你的数据库延迟乘以表中的列数。