zoukankan      html  css  js  c++  java
  • Sqlserver 游标 慢

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

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

    优化思考:
    由于前台需要多次调用数据库,试想把改功能封装成一个存储过程实现,前台负责传输参数,有存储过程计算拼接之后返回html结果。
    其实对于这样统计为什么会要通过遍历多个数据集去拼接字符串呢?为什么不通过数据库关连查询出来这个结果呢?其实开始想过使用行列转换去实现,刚好sqlserver 2005中有pivot实现行列转换,但后面使用之后发现,实现转换的那列需要是数字类型(INT),而我们的结果备注这列都是字符型的,而且类似C3列的结果可能不唯一,比如多个值时应该出来21;22,所以使用行列转换解决不了。
    最后编写存储过程算法完全跟前台一致,原先遍历表存储过程使用游标去遍历,最后测试结果让人失望,竟然超时,比原先的调用方式还慢,查查原因,原来都是游标惹的祸,原来用游标遍历大批量数据会超级慢。
    解决办法一:
    用表变量方式代替游标,类似如下:

    DECLARE @t1 TABLE (nd VARCHAR(4))
    DECLARE @t TABLE (nd VARCHAR(4),rownum INT)
     DECLARE
                 @rq date,@i INT ,@rownum INT,@n VARCHAR(4)
    INSERT INTO @t1 
    SELECT DISTINCT  year(b.dossvalue)as n FROM c6.dbo.vw_DossierValue b
     where b.DossierFieldID = '28'  and b.dossvalue>'2003-01-01' and b.dossvalue<>''
    INSERT INTO @t
    SELECT nd,ROW_NUMBER () OVER (ORDER BY nd) from @t1 
     SELECT
                @rownum =@@ROWCOUNT ,@i = 1 from @t
            WHILE @i <=@rownum
            BEGIN
    
                SELECT
                    *
                FROM
                    @t
                WHERE
                    rownum =@i
                SET @i =@i + 1
                END
  • 相关阅读:
    有关系统架构的高可用原则
    Redis面试篇 -- 如何保证缓存与数据库的双写一致性?
    Redis面试篇 -- Redis常见性能问题和解决方案?
    Redis面试篇 -- Redis主从复制原理
    Python3如何安装pip工具?
    Redis面试篇 -- Redis持久化的方式有哪些?优缺点分别是什么?
    Linux在丢失的情况下重置密码
    APC (Asynchronous Procedure Call)
    eigenface资料整合
    python+opencv模拟生成运动模糊核
  • 原文地址:https://www.cnblogs.com/lydg/p/11602254.html
Copyright © 2011-2022 走看看