将列设置为null时,可以提高更新性能

时间:2011-12-06 17:29:04

标签: sql performance sql-server-2008

这里有点远,但我在下面有一个简单的查询:

begin transaction       

update s
set s.SomeField = null
from someTable s (NOLOCK)

rollback transaction

这在约30秒内运行,靠近SQL Server框。我可以使用任何技巧来提高速度。该表中有144,306行。

感谢。

5 个答案:

答案 0 :(得分:2)

像这样的大型UPDATE命令性能的最大组成部分将是数据库日志的速度。

为获得最佳表现:

  1. 确保DB日志(LDF文件)位于与DB数据(MDF文件)不同的物理主轴上
  2. 避免日志卷的奇偶校验RAID,例如RAID-5;
  3. 更好的是RAID-1或RAID-10
  4. 确保数据库日志文件已预先生成,并且它在磁盘上是物理上连续的
  5. 确保您的服务器有足够的RAM - 理想情况下,至少足以容纳包含已修改行的所有数据库页
  6. 将SSD用于数据驱动器也可能有所帮助,因为该命令将创建大量脏缓冲区,稍后由懒惰写入器刷新到磁盘;这可能会使DB上的其他操作在发生时变慢。

答案 1 :(得分:1)

如果没有约束,并且你真的需要将该列的所有值都设置为NULL,那么我会测试删除列并重新添加它。

不确定这是否会更快,但我会调查它。

答案 2 :(得分:1)

答案 3 :(得分:1)

您可以稍微更改查询的语法,但我的测试没有区别。我使用的是STATISTICS IOSTATISTICS TIME

您提到该列已编入索引。您可以在事务中禁用它/重新启用它。 t-sql很简单,请参阅 - http://blog.sqlauthority.com/2007/05/17/sql-server-disable-index-enable-index-alter-index/

我过去必须为类似的工作做这件事,而且对我来说效果很好。

答案 4 :(得分:0)

尝试像这样实施

Disable Index

Drop the column
Create the column

Rebuild index

我猜它会提高性能。