update语句与delete语句与insert语句最大的不同在于:通常使用insert语句时都是单条插入,但update与delete则不同,组合where条件,我可以批量操作数据库中的数据。
在开发中,我们尽量不要一条一条去执行修改与删除语句,当然,前提是指你需要删除批量数据的时候而你又使用循环执行单条删除的方法,因为这样做的效率会很低,执行时间会很长。但是,如果我们一条操作的数据量过多,又会造成数据库服务器的CPU使用率过高,如果此刻有用户在使用数据库,必然会影响用户的操作。所以,我们可以根据用户的具体情况来决定操作方式:
1,如果是在非工作时段,则应该尽可能地在一条语句中更新或者删除数据。这是完成操作的最快方法,虽然会造成数据库服务器CPU使用率过高,但因为此时没有用户在访问数据库,所以不会造成不良影响。
2,如果是在工作时段,则应该根据实际情况将update与delete语句拆分成多句来执行,每执行一段休息一段时间,这样虽然执行时间长了,但不会影响用户的操作。
下面,我们就来讲讲怎么让sql语句执行一段就休息一会再执行的方法:
利用WAITFOR语句:
作用:在达到指定时间或时间间隔之前,或者指定语句至少修改或返回一行之前,阻止执行批处理、存储过程或事务。
语法:WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| ( receive_statement ) [ , TIMEOUT timeout ]
}
示例:
update table1 set amout=amout*1.1 where id<200
waitfor delay '00:00:00:100'
update table1 set amout=amout*1.1 where id >=200 and id<=500
waitfor delay '00:00:00:100'
update table1 set amout=amout*1.1 where id >500
这样,我们就把本来应该是
update table1 set amout=amout*1.1
的语句分成了三段来执行,每执行一段,就休息100毫秒(中间的休息时间应该根据不同的服务器来设置,我们应该在测试环境中多次测试,以算出最佳休息时间),这样,数据库服务器的CPU使用率可以得到明显下降。
注意:1,执行 WAITFOR 语句时,该事务会处于运行状态,其他请求不能在同一事务下运行。
2,WAITFOR会阻止事务的处理,所以在同一事务中所有执行都会等WAITFOR执行完成才会返回结果,如:
select 1
WaitFor Delay '00:00:05:000'
select 2
事务会在5秒后同时打印出1与2,而不是先打印1,等待5秒后再打印出2>