代码之家  ›  专栏  ›  技术社区  ›  Marcus L

LINQ更新过程-最佳实践

  •  2
  • Marcus L  · 技术社区  · 14 年前

    • 对象,并将所有更改提交到 一次性录制?
    • 要有一个静态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 回复  |  直到 13 年前
        1
  •  1
  •   Kirk Broadhurst    13 年前

    更新双细胞是非常低效的。更新数据库的主要开销是实例化连接、发送;接收回复,并在表中查找要更新的行。如果按单元格更新,则需要对每个单元格执行这些步骤-如果按行更新,则每行更新一次。

    单独更新单元格相当于编写类似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
    

    有几个步骤涉及,如果你想它的物理和实际的一切都应该是有意义的。

    首先,linqtosql检索整行,以便更新属性。“每单元格”或“每行”操作都需要这样做,因此所需时间相同。

    // 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 server接收答复

    与另一台服务器通信可能需要几毫秒到几秒钟不等的时间,具体取决于距离、性能、服务器负载等。

    然后更新属性。

    row.Column1 = data;
    

    这只需要一个周期。它是整个运行时间中一个不可估量的小部分。

    然后提交更改。

    scope.SubmitChanges();
    
    -- sql looks like this
    UPDATE [MyTable] SET /* set of columns to update */ WHERE [Id] = @id
    

    这同样涉及许多步骤

    • 编译查询
    • 从SQL Server接收响应

    单独更新单元格并没有什么“即时”的,单元格将在同一时间更新,因为整行将使用“每行”模式更新。只是剩下的细胞需要 比较长的

    不仅如此,从你的问题看,你还将有数百个样板 UpdateProperty