0

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

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

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

其他人都做什么,您是否只更新该行的每一列?

4

4 回答 4

7

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

SQL Server 将数据存储在 8000 字节的页面中。如果更新 1 位,SQL Server 会将其写为完全更改的页面:8000 字节的数据。因此,通过更新少于 20 个字段,您不会节省任何磁盘活动。

优化性能通常是一个错误。这些天数据库非常快。而是针对简单明了的代码进行优化。

于 2012-08-02T19:01:59.227 回答
4

实体框架(或其他 ORM 工具)之类的工具将为您“免费”处理这个问题。

他们跟踪您的对象中发生了什么变化,并且他们将发布一个量身定制的UPDATE声明,只更新那些实际发生变化的列。

您无需再担心任何这些细节。都为你照顾。尝试一下!

资源:

于 2012-08-02T19:03:48.583 回答
0

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

这将比仅在单个更新语句中更新所有字段更昂贵,因此我会选择单个更新选项。

于 2012-08-02T19:02:35.490 回答
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 中的查找时间是成本所在,因此将列更新为自身应该非常便宜。

于 2012-08-02T19:21:19.577 回答