2011-12-30 32 views
3

MS SQL SRVR 2005/2008 2003+MS SQL Server的性能在Win SRVR UPDATEing一列VS所有列

我一次只更新1行,更新响应于用户的变化网页表单。

我正在使用PK更新表中的几列。该表有95列。通常1个FK列和1个或2个其他列将被更新。桌子上有6个FK。

对于我来说,动态生成UPDATE语句只对UPDATE的SET部分中的列进行更改,还是使用当前存储过程对所有列使用参数化更新对我有利?

当前,无需立即更改,网络表单中的数据将发布回服务器并用于更新。我无法跳转到AJAX方案,此时只有已更改的数据从客户端浏览器回发到服务器。

感谢名单, 摹

+0

[这个问题在这里看到(http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx) – 2011-12-30 20:09:51

+0

@MartinSmith:这是一个不同的问题。这个问题关于您是否可以通过仅更新已更改的列进行优化。您链接的文章将讨论一个根本不会执行任何更改的更新。 – Andomar 2011-12-30 20:17:39

+0

@Andomar - Yep实际上是一个不同的问题,但仍然非常相关,OP可以使用从那里检查自己的技术。 – 2011-12-30 20:27:03

回答

2

SQL服务器读取和写入数据组成的8KB的 “页面”。通常,页面将包含一行或多行。

由于磁盘I/O是更新的昂贵部分,更新列的一半和所有列的成本大致相同。它仍然会导致8kb的磁盘I/O。

还有另一个方面,通常不起作用,因为SQL Server在8kb页面中写入。但是想象一下,你的行看起来是这样的:

id int identity 
col1 varchar(50) 
col2 varchar(50) 

现在,如果你更新col1为5个字节,col2必须由五个字节向前移动。因此,即使您不更新col2,它仍然必须写入磁盘。

+0

而我的表也有这个varchar问题。 在这一点上,我们将继续更新所有列的做法。 我从 开始做出这个决定 - 阅读@MartinSmith的建议,指向我的Paul_White博客, - 以及Andomars关于磁盘I/O成本的忠告, - 再加上另一位朋友关于复杂性和处理时间的建议查询动态, - 每次使用相同的更新语句时缓存查询计划的注意事项。非常感谢,谢谢先生们。 – GaryH 2011-12-31 00:49:04

0

在性能方面,更新在单个更新中更新多个列比在多个更新中更新单个列更好,一旦数据库锁定行以更新用于更改值的时间不是性能问题,则另一个如果您有多个连接尝试访问相同的信息,那么锁定行所需的时间可能会导致性能问题,并且可能会变得最糟糕。我建议保留参数化存储过程,而不是尝试更新单个行列。