mysql游标很慢_Sqlserver 游标 慢

在.NET项目的一个统计模块中,原有的方法由于涉及多表查询和遍历数据集生成HTML,导致性能低下。考虑将功能封装为存储过程以减少数据库调用,但在尝试使用SQL Server的游标遍历大量数据时出现超时。解决方案是用表变量替换游标,提高处理速度。
摘要由CSDN通过智能技术生成

.net项目中有个模块做统计功能,原先方法速度很慢,所以需要改进,统计结果如下图: 下图接上图后面: 原先的处理方式是,这些数据分别涉及到四五张表,前台从数据库中查询出需要的数据集,然后分别遍历这些数据集拼接html字符串显示在界面上。 优化思考:

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

test.jsp?url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201111%2F17%2F0_13215218892991.gif&refer=http%3A%2F%2Fblog.csdn.net%2Fpanfb227%2Farticle%2Fdetails%2F6982817

下图接上图后面:

test.jsp?url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201111%2F17%2F0_1321521896Nphe.gif&refer=http%3A%2F%2Fblog.csdn.net%2Fpanfb227%2Farticle%2Fdetails%2F6982817

原先的处理方式是,这些数据分别涉及到四五张表,前台从数据库中查询出需要的数据集,然后分别遍历这些数据集拼接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

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值