游标会锁表吗???

tongji_0009 2015-01-16 10:23:24
几个存储过程(“sp1,sp2,sp3,sp4,sp5,sp6”)同时从DAList表中读取不同类型的数据,分别进行各种计算处理。 计算完成后从DAList表删除改条数据。
问题一:
几个存储过程(“sp1,sp2,sp3,sp4,sp5,sp6”)里面都定义了游标“Cur” 从 T_DAList表中查询数据。 那么当这几个存储过程作为作业独立运行的时候,相互之间会不会相互锁定,相互等待???


问题二:
游标和临时表各有什么优缺点??? 什么时候应该使用临时表? 什么时候应该使用游标?

问题三:
这种情况使用游标是不是更合适???

Select @DADayNow = CONVERT(varchar(100), GETDATE(), 112)
--print left(@DADayNow,6)

DECLARE Cur CURSOR FOR --控制只取前25000行数据做计算
SELECT TOP 500 DANo,UpdateTime,LogTime,DataType,DAType,DAYear,DAMonth,DADay,DAHour,CollegeNo,CampusNo,BuildingNo,BuildingType,SumQty,EType,EIndex,
ESubitem,ESubitem1,ESubitem2,Unit,Lable,Note FROM T_DAList

WHERE DataType='Public' and DAType='h' and ESubitem!='' ORDER BY (DAYear+DAMonth+DADay+DAHour)

OPEN Cur
...全文
1099 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
starrycheng 2015-01-27
  • 打赏
  • 举报
回复
游标的效率为什么没有临时表的速度快???
xiaoxiangqing 2015-01-20
  • 打赏
  • 举报
回复
应该不会,除非里面有用到事务
starrycheng 2015-01-20
  • 打赏
  • 举报
回复
大神们啊,临时表会自动优化对吗???
Tiger_Zhao 2015-01-16
  • 打赏
  • 举报
回复
这和用不用游标没有关系。
同一个DAList表的同一条记录,如果6个sp都要用到,就不能在这些sp中删除,必须是上层调用过程调用完6个sp后才能删除。既然调用6个sp的时候数据不变,直接取DAList表好了,用得着什么游标、临时表吗?
如果这条记录,6个sp谁抢到了谁计算、删除,那么用UPDATE语句直接设个占用标记就可以了,还是用不着游标、临时表。
还在加载中灬 2015-01-16
  • 打赏
  • 举报
回复
如果你的游标只用于处理类似遍历的效果,不在每次游标指向里过多涉及其他集合的关联操作,是可以用,速度也很快 但其他情况,游标是效率是慢于集合操作的,SQLSERVER会进行一定的优化,按照比较好的方式执行,而你用游标相当于限定死优化空间,效率会比较慢,一般选择游标是下策。 游标确实可以不上锁,但考虑多线执行的话,我想你应该会上锁的,如果你不打算锁表,你又怎么能确保事务的统一性呢? 在这种情况,我想对效率要求比较高,因此我想你处理方式,还是取决于我最开始说的,你用于处理什么样的需求。 问题一,就算不上锁,操作到相同表肯定有影响 问题二,我更愿意说游标操作应该拿来与集合操作比较,视需求而定 问题三,看不出有什么需求 你也可以到这边来多了解下游标 http://www.cnblogs.com/knowledgesea/p/3699851.html
starrycheng 2015-01-16
  • 打赏
  • 举报
回复
引用 2 楼 Tiger_Zhao 的回复:
一:默认的游标是 READ_ONLY的,不会加锁。 二:其实你给游标加上 STATIC 选项,就是自动把 SELECT 的结果放在一个临时表中,游标从临时表取数。 三:游标最主要的是一次只操作一条数据,和表没有直接的可比性。关键看需求来决定采用什么方式。
大神,几个存储过程(“sp1,sp2,sp3,sp4,sp5,sp6”)同时从DAList表中读取不同类型的数据,分别进行各种计算处理。 计算完成后从DAList表删除改条数据。。。 这种需求用临时表合适,还是用游标合适啊??? 求大神指点啊。
Tiger_Zhao 2015-01-16
  • 打赏
  • 举报
回复
一:默认的游标是 READ_ONLY的,不会加锁。
二:其实你给游标加上 STATIC 选项,就是自动把 SELECT 的结果放在一个临时表中,游标从临时表取数。
三:游标最主要的是一次只操作一条数据,和表没有直接的可比性。关键看需求来决定采用什么方式。
starrycheng 2015-01-16
  • 打赏
  • 举报
回复
应该使用历史表更合适吧。
starrycheng 2015-01-16
  • 打赏
  • 举报
回复
引用 4 楼 ky_min 的回复:
如果你的游标只用于处理类似遍历的效果,不在每次游标指向里过多涉及其他集合的关联操作,是可以用,速度也很快 但其他情况,游标是效率是慢于集合操作的,SQLSERVER会进行一定的优化,按照比较好的方式执行,而你用游标相当于限定死优化空间,效率会比较慢,一般选择游标是下策。 游标确实可以不上锁,但考虑多线执行的话,我想你应该会上锁的,如果你不打算锁表,你又怎么能确保事务的统一性呢? 在这种情况,我想对效率要求比较高,因此我想你处理方式,还是取决于我最开始说的,你用于处理什么样的需求。 问题一,就算不上锁,操作到相同表肯定有影响 问题二,我更愿意说游标操作应该拿来与集合操作比较,视需求而定 问题三,看不出有什么需求 你也可以到这边来多了解下游标 http://www.cnblogs.com/knowledgesea/p/3699851.html
需求就是如上所述啊,遍历表里面的数据。 多个存储过程同时运行,数据都来自T_DAList表,但是数据是不同的。 不会出现多个存储过程处理同一条记录的情况。 这个时候用 游标效率高,还是临时表效率高啊。
Tiger_Zhao 2015-01-16
  • 打赏
  • 举报
回复
既然数据互不相关,游标或直接操作DAList都可以。临时表多复制一份数据没必要。
starrycheng 2015-01-16
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
这和用不用游标没有关系。 同一个DAList表的同一条记录,如果6个sp都要用到,就不能在这些sp中删除,必须是上层调用过程调用完6个sp后才能删除。既然调用6个sp的时候数据不变,直接取DAList表好了,用得着什么游标、临时表吗? 如果这条记录,6个sp谁抢到了谁计算、删除,那么用UPDATE语句直接设个占用标记就可以了,还是用不着游标、临时表。
6个sp处理的是 T_DAList表里的不同类型的数据,比如。 一个存储过程处理年数据,一个存储过程处理月数据,一个存储过程处理日数据,一个存储过程处理时数据。
卖水果的net 版主 2015-01-16
  • 打赏
  • 举报
回复
问题一: 相互之间会不会相互锁定,相互等待??? 不会,除非你的这几个过程都操作同一张,才会等待,跟你的取的游标的名称没关系。 问题二: 游标和临时表各有什么优缺点??? 什么时候应该使用临时表? 什么时候应该使用游标? 游标是一次处理一条记录,临时表可以批量处理多行。 问题三: 这种情况使用游标是不是更合适??? 这个要看你最终要对数据做什么样的操作了,能用临时表就不要用游标。

34,589

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧