如果我有一个包含 20 个字段的个人资料表单,用户可以在页面上更新。如果用户只更改了两个字段,那么运行更新每一列的更新语句似乎是一种浪费。
我想知道什么是最好的方法来处理这个以获得最佳性能。
由于我只有 20 个字段,这并不是一个真正的问题,但我只是想知道未来的发展可能会更多。
其他人都做什么,您是否只更新该行的每一列?
您的平均网络数据包长度为 1500 字节。这可能很容易包含您的 20 个字段。因此,您可以通过更新少于 20 个字段来节省网络负载。
SQL Server 将数据存储在 8000 字节的页面中。如果更新 1 位,SQL Server 会将其写为完全更改的页面:8000 字节的数据。因此,通过更新少于 20 个字段,您不会节省任何磁盘活动。
优化性能通常是一个错误。这些天数据库非常快。而是针对简单明了的代码进行优化。
实体框架(或其他 ORM 工具)之类的工具将为您“免费”处理这个问题。
他们跟踪您的对象中发生了什么变化,并且他们将发布一个量身定制的UPDATE
声明,只更新那些实际发生变化的列。
您无需再担心任何这些细节。都为你照顾。尝试一下!
资源:
MSDN 数据开发人员中心中的实体框架- 大量文档、白皮书、代码示例、视频等
ASP.NET 站点 - 实体框架,包含大量关于如何将 EF 与 ASP.NET(Webforms 和 MVC)应用程序一起使用的教程
我只能想象获取当前的数据库记录,逐个字段与用户输入进行比较,然后只更新更改的字段。
这将比仅在单个更新语句中更新所有字段更昂贵,因此我会选择单个更新选项。
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 中的查找时间是成本所在,因此将列更新为自身应该非常便宜。