如果我有一个包含20个字段的个人资料表单,则用户可以在页面上进行更新。如果用户只更改了两个字段,那么运行一个更新每个列的更新语句似乎是一种浪费。
我想知道什么是最好的方法来处理这个以获得最佳性能。
由于我只有20个字段,这不是一个真正的问题,但我只是想知道未来的发展可能会更多。
其他人做了什么,你只是更新该行的每一列吗?
答案 0 :(得分:7)
您的平均网络数据包长度为1500字节。这可能很容易包含你的20个字段。因此,您可以通过更新少于20个字段来节省网络负载。
SQL Server以8000字节的页数存储数据。如果更新1位,SQL Server将把它写为完全更改的页面:8000字节的数据。因此,通过更新少于20个字段来保存没有磁盘活动。
优化性能通常是一个错误。如今数据库非常快。相反,优化简单明了的代码。
答案 1 :(得分:4)
Entity Framework(或其他ORM工具)等工具将为您“免费”处理此问题。
他们会跟踪对象中的更改内容,并会发出一个定制的UPDATE
语句,该语句只会更新实际更改过的列。
您不必再担心任何这些细节了。一切都照顾好你。试试吧!
资源:
Entity Framework in the MSDN Data Developer Center - 大量的文档,白皮书,代码示例,视频等
ASP.NET site - Entity Framework有很多关于如何在ASP.NET(Webforms和MVC)应用程序中使用EF的教程
答案 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中的查找时间是成本所在的位置,因此将列更新为自身应该非常便宜。