首页 新闻 搜索 专区 学院

游标阻塞问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-11-15 10:04

declare cur cursor for select ....

open cur

while @@fetch_status=0

begin

     if exists(select 1 from tb where id=@id)

  begin

    update tb set .... where id=@id

  end

  else

  begin

    insert tb....

  end

  fetch next from cur into....

end

close cur

deallocate cur

 

在长事务里面阻塞了其他查询,请问怎么处理比较好。

清海扬波的主页 清海扬波 | 小虾三级 | 园豆:793
提问于:2012-11-08 20:12
< >
分享
最佳答案
0

语句很复杂的?从这上面的看似乎那个IF可以去掉的。游标是不是也可以去掉?我听朋友说可以用其它办法代替游标的

收获园豆:20
happydaily | 菜鸟二级 |园豆:264 | 2012-11-08 20:14

要先判断是否存在,有就更新,没有就插入,不能去掉,也就是这里更新的时候出现阻塞。

清海扬波 | 园豆:793 (小虾三级) | 2012-11-08 20:22

@清海扬波: 那这样的操作,能不能放到程序不忙的时候,去做这样的一个事情

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-08 20:46

@chenping2008: 就一个UPdate怎么会阻塞,是不是UPdate语句有问题呢?像这样的语句可以改为如下操作,先更新,如果更新的rowcount为0,说明没有更新成功,再进行插入。

update tb set .... where id=@id ;if(@@rowcount==0) begin insert end

happydaily | 园豆:264 (菜鸟二级) | 2012-11-08 21:24

@happydaily: 是update把select阻塞了,这是一个长事务,几千条数据是在一个事务里面的

清海扬波 | 园豆:793 (小虾三级) | 2012-11-08 22:49

@happydaily: 明天试试你这个方法

清海扬波 | 园豆:793 (小虾三级) | 2012-11-08 22:50

@清海扬波: 几千条数据 还是几千条代码啊?如果只有几千条数据对于SQL来说是小意思啊,你最好说出你的业务规则,这样更好帮助你解决,可能是不需要游标的。

happydaily | 园豆:264 (菜鸟二级) | 2012-11-09 08:31

@happydaily: 

if exists(select 1 from tb where id=@id)

发现瓶颈在这里,在id上面加了聚集索引,马上就快了。但是奇怪的是主键索引是有覆盖这个的,没有走。

清海扬波 | 园豆:793 (小虾三级) | 2012-11-10 11:26

@清海扬波: 用我给你的方法直接更新,更新失败再新增

happydaily | 园豆:264 (菜鸟二级) | 2012-11-10 14:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册