Sql Update语句是否运行太长时间

Sql Update语句是否运行太长时间,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我对处理这么多数据(2000万行)还不熟悉,但我不知道在查询持续时间方面应该期待什么: update table set field = '1234' 字段上没有索引。这项声明花了25分钟。数据库设置为简单恢复。25分钟似乎太长了吗?表有9列,数据类型较小 是否有引用该字段的索引视图 该字段是否在(事务性)复制方案中发布 其他会话是否在更新运行的同时访问该表 日志和数据文件是否存储在单独的磁盘上(物理磁盘,而不是同一硬件的两个不同分区) 是否存在引用该字段的检查约束 那张桌子上有触发器吗

我对处理这么多数据(2000万行)还不熟悉,但我不知道在查询持续时间方面应该期待什么:

update table set field = '1234'  
字段上没有索引。这项声明花了25分钟。数据库设置为简单恢复。25分钟似乎太长了吗?表有9列,数据类型较小
  • 是否有引用该字段的索引视图
  • 该字段是否在(事务性)复制方案中发布
  • 其他会话是否在更新运行的同时访问该表
  • 日志和数据文件是否存储在单独的磁盘上(物理磁盘,而不是同一硬件的两个不同分区)
  • 是否存在引用该字段的检查约束
  • 那张桌子上有触发器吗
所有这些,以及可能的许多其他因素,都将影响数据修改性能


否则,请尝试使用
TOP
和只查找修改的行的
WHERE
子句批处理更新。

如果您在一个事务中更新了2000万行,那么您的时间完全由IO子系统驱动:您有什么类型的驱动器,什么样的磁盘文件布局等。如果raid 10中有40个磁盘轴,其中有4个平衡文件和一个单独的类似日志电池,那么结果会慢得令人担忧。如果您在一个消费品质量为5000rpm的硬盘上使用一个MDF与LDF共享主轴进行测试,那么您的时间将非常快。

您将在大约1500秒内更新2000万条记录,平均每秒更新7000次。听起来不错。

服务器负载如何?你们有并没有看过探查器,看看这个盒子是不是因为CPU还是内存而被征税?你们正在更新2000万行?请告诉我您的实际更新语句中有一个where子句。@OMG Ponies:我们刚刚安装了Windows Server 2008 R2,我查看了sql Server进程,它只使用了28MB内存。我不记得Windows XP允许sql占用了这么多内存Server@Beth:没有。在这个查询中,Where子句既不需要也不需要。+1:对于这样的情况,IO始终是问题所在,还是存在一个模糊的转折点?对于单个update语句中的2000万行,所有这些都将由日志刷新的速度来驱动,由于空闲页的缓冲池压力,DB检查点启动时会出现一些尖峰。指示信号是
平均磁盘队列长度
(>2个/轴)和
平均秒/传输
(>10ms)性能计数器@subt13:即使在简单模式下,事务也必须记录每一行的更改,以便进行回滚。20M行->日志中的20M更改记录+为20M撤消操作保留的空间,它需要日志空间,并且每一位都必须写入磁盘。只有当您有多个事务时,恢复模型才会发挥作用,但无论采用何种恢复模型,恢复模型都不会加快速度。对于某些插入操作,只有大容量可能会更快,而对于更新则不会。您可以尝试磁盘分区对齐:我尝试过批处理,但不确定批处理的大小。我试了10000次,但花的时间更长。因为数量级在我预期的范围内,少于1000次会比40000次更奇怪。