Sqlserver 游标 慢

摘要:
事实上,我开始考虑使用行和列转换。恰好在sqlserver2005中使用了pivot来实现行和列转换。然而,在后来使用它之后,我发现实现转换的列需要是数字类型的,并且我们的结果注意到,该列是字符类型的,类似于C3列的结果不可能是唯一的,例如,当有多个值时,应该是21;22,因此不能通过使用行和列转换来解决。

.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

免责声明:文章转载自《Sqlserver 游标 慢》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux Oracle 11g dataguard物理standby的配置input框中如何添加搜索下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sqlserver prompt工具的使用

【1】Prompt 下载安装 【1.1】下载 官网:https://www.red-gate.com/products/sql-development/sql-prompt/trial/index-b 国内代理(中文、以及非常详细具体的教程):慧都网 【1.2】安装 本文下载:https://download.red-gate.com/SQLPromptD...

游标小例

一,游标的 作用: 当在存储过程,函数,批处理,触发器中 使用 select 返回多条记录时,游标提供了一个可以对记录进行逐条处理的 方法.二,游标的使用方法:1,使用Declare Cursor语句,根据Select语句创建游标.有两种操作方法,效果是一样的,请注意他们的区别 :第一种:声明变量,然后设置游标Declare @MyVariable Cur...

oracle高级部分

回顾 多表关联查询的方式内连接 根据AB表关联的条件进行过滤查询,只保留满足条件数据 Select * from a,b where a.xxx=b.xxx;     Select * from a inner join b on a.xxx=b.xxxx     inner join c on a.xxxx=c.xxxx 外连接 左外连接 以左表为...

一个可以选择目录生成doc目录内容的小工具(二)-os库目录遍历

回到一目录遍历是一个经典话题,花些功夫也很值得。(好在之前了解过)实现目录遍历的方式有三种,递归、栈、队列。递归一般是函数自己调用自己,一直到满足退出的条件。栈和队列就是数据结构,栈stack是后进先出,队列queue是先进先出。很好理解。(在python里没有这两种数据对象,实现上就是个list,看你怎么捣鼓。一般目录遍历使用递归就可以,简单快捷。感觉堆...

sql server百万级别数据量 农码一生

1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数...

Oracle面试题(基础篇)

1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性 2). oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-...