处理多个列的更新的最佳方法是什么

时间:2012-08-02 18:57:46

标签: c# asp.net sql

如果我有一个包含20个字段的个人资料表单,则用户可以在页面上进行更新。如果用户只更改了两个字段,那么运行一个更新每个列的更新语句似乎是一种浪费。

我想知道什么是最好的方法来处理这个以获得最佳性能。

由于我只有20个字段,这不是一个真正的问题,但我只是想知道未来的发展可能会更多。

其他人做了什么,你只是更新该行的每一列吗?

4 个答案:

答案 0 :(得分:7)

您的平均网络数据包长度为1500字节。这可能很容易包含你的20个字段。因此,您可以通过更新少于20个字段来节省网络负载。

SQL Server以8000字节的页数存储数据。如果更新1位,SQL Server将把它写为完全更改的页面:8000字节的数据。因此,通过更新少于20个字段来保存没有磁盘活动。

优化性能通常是一个错误。如今数据库非常快。相反,优化简单明了的代码。

答案 1 :(得分:4)

Entity Framework(或其他ORM工具)等工具将为您“免费”处理此问题。

他们会跟踪对象中的更改内容,并会发出一个定制的UPDATE语句,该语句只会更新实际更改过的列。

您不必再担心任何这些细节了。一切都照顾好你。试试吧!

资源:

答案 2 :(得分:0)

我只能想象获取当前的db记录,逐字段地与用户输入进行比较,然后只更新已更改的字段。

这比仅更新单个更新语句中的所有字段更昂贵,因此我选择单一更新。

答案 3 :(得分:0)

CREATE PROC [dbo].[UpdateMe]
(
    @pkey int,
    @Col1 int = null,
    @Col2 int = null,
    ...,
    @Col20 int = null
)
AS BEGIN

    UPDATE [Table]
           SET Col1 = ISNULL(@Col1,Col1),
           Col2 = ISNULL(@Col2,Col2),
           ...
           Col20 = ISNULL(@Col20,Col20)
    WHERE pkey = @pkey

END

跟踪客户端上的更改并相应地发送内容。 如果您担心发送到线路,请使用命名参数并仅发送已更改的内容。由于程序有默认值,因此不需要任何费用。 sql中的查找时间是成本所在的位置,因此将列更新为自身应该非常便宜。