日期:2014-05-16  浏览次数:20619 次

请教两个sql语句
本帖最后由 up369 于 2014-04-05 19:58:55 编辑
update table1 set bz=1 where id in('123','1111','333323','87676')
update table2 set bz=1 where id in('767','11987','2323',82828')
当多个用户同时操作上面两个语句时(id值都不相同)会不会很慢,或者阻塞,死锁之类的问题?谢谢。
id设为主键,表中数据有100万条
------解决方案--------------------
id是主键,那么也就是都不相同,那么也就有聚集索引,只要你的in重的id不是太多,那么应该是很快的,应该直至需要0.00几秒就可以更新完成的。

所以,很快,由于id都不同,所以也不会有阻塞的问题,至少update操作不会相互阻塞,也不会有死锁的问题。


------解决方案--------------------
引用:
在网上查了一下说是in要对整个表进行扫描,是这样么?如果是岂不是很慢?


数据库引擎这点优化还是会自动做到的
------解决方案--------------------
阻塞,死锁之类的问题,sql本身会处理的吧
------解决方案--------------------
会不会很慢,或者阻塞,死锁之类的问题?

你一共问到三点:
1.慢不慢的问题,不用考虑.
2.阻塞,这个要看你的执行完这个以后,提交的是否及时。
3.死锁是”你不给我钱,我不给你货“ ”你不给我货,我不给你钱“ 两个执着人(会话)引起的,也就是除了这条 update (钱的问题)之外,是否还有其他的update或delete(货的问题)。总之 一句话,单单一条 update ,不会引起死锁。
------解决方案--------------------
1、死锁 不可能。一般是 持有资源  占有其他资源才能死锁。不会更新语句以 排他的 不可能死锁

2、性能的问题这个建议是 id 建立 索引。

更新语句  看看执行计划。 最好写成 update table where id=1;update table where id=2 

------解决方案--------------------
如果id为整型,则不用单引号,Update 时建议加上行锁 
update table1 WITH (ROWLOCK) set bz=1 where id in(123,1111,333323,87676)
update table2 WITH (ROWLOCK) set bz=1 where id in(767,11987,2323,82828)


------解决方案--------------------
IN什么最好少用   性能不高