加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Sqlserver 游标 慢

发布时间:2020-12-12 14:51:25 所属栏目:MsSql教程 来源:网络整理
导读:?.net项目中有个模块做统计功能,原先方法速度很慢,所以需要改进,统计结果如下图: 下图接上图后面: 原先的处理方式是,这些数据分别涉及到四五张表,前台从数据库中查询出需要的数据集,然后分别遍历这些数据集拼接html字符串显示在界面上。 优化思考:

?.net项目中有个模块做统计功能,原先方法速度很慢,所以需要改进,统计结果如下图:

下图接上图后面:

原先的处理方式是,这些数据分别涉及到四五张表,前台从数据库中查询出需要的数据集,然后分别遍历这些数据集拼接html字符串显示在界面上。

优化思考:

由于前台需要多次调用数据库,试想把改功能封装成一个存储过程实现,前台负责传输参数,有存储过程计算拼接之后返回html结果。

其实对于这样统计为什么会要通过遍历多个数据集去拼接字符串呢?为什么不通过数据库关连查询出来这个结果呢?其实开始想过使用行列转换去实现,刚好sqlserver 2005中有pivot实现行列转换,但后面使用之后发现,实现转换的那列需要是数字类型(INT),而我们的结果备注这列都是字符型的,而且类似C3列的结果可能不唯一,比如多个值时应该出来21;22,所以使用行列转换解决不了。

最后编写存储过程算法完全跟前台一致,原先遍历表存储过程使用游标去遍历,最后测试结果让人失望,竟然超时,比原先的调用方式还慢,查查原因,原来都是游标惹的祸,原来用游标遍历大批量数据会超级慢。

解决办法一:

用表变量方式代替游标,类似如下:

DECLARE @t  TABLE (
ph  VARCHAR(20),tdate   VARCHAR(6),qty NUMERIC(18),rownum INT  
)  
DECLARE  @i INT,@rownum int 
INSERT INTO @t
SELECT ph,tdate,qty,ROW_NUMBER()OVER(ORDER BY  ph) FROM tb_a  
SELECT  @rownum=@@ROWCOUNT,@i=1  

WHILE @i<=@rownum  
BEGIN  
    SELECT * FROM @t WHERE  rownum=@i  

    SET  @i=@i+1  
END

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读