谁说游标一定慢?

原创 2005年12月31日 10:03:00

昨天在SQL Server版面上遇到了这样的一个问题:

有一个表如下:
CREATE TABLE [#tmp](px int IDENTITY(1,1),value int)
大约有10000条记录,value 字段是一个随机的值,现要求是输入的一个值M,要找出前N条记录,且N条记录value的总和刚好不大M(意思是再多一条记录都会大于M)。

要求:语句运行时间要求在1秒种内完成

说明:
px值小的认为是排在px大的前面,可以用存领储过程、函数 

示例数据为:
px   value
----------
5    5
4    12
7    9
1    3
3    6
6    23
2    15

则,录入20,找出:
px   value
----------
1    3
2    15


1、
最初打算用最常规的方法来实现这个需求,但是不考虑效率方面的要求:

select a.* from #tmp a where (select sum(value) from #tmp where px<=a.px)<=@m

结果在10,000条测试数据的压力测试下,整个查询历时41s,与效率要求相去甚远


2、
于是,转而通过遍历表的方式实现查询:

declare @px int,@s bigint,@m int
set @s=0
set @m=20

update a
set
    @px=case when @s<=@m then px else @px end,
    @s =@s+value
from
    #t1 a

select * from #t1 where px<@px order by px

在100,000条测试数据的情况下,效率基本满意,但是又出现了新的问题,一旦px字段不是按升序排列,查询的结果就不正确

3、
与pbsql(风云)君子所见略同,决定用游标

declare @px int,@value int,@sum int,@m int,@px1 int
set @sum=0
set @m=20

declare t_cursor cursor for select px,value from #tmp order by px

open t_cursor
fetch next from t_cursor into @px,@value

while @@fetch_status=0
begin
    if(@sum>@m)
        break
    set @sum=@sum+@value
    set @px1=@px
    fetch next from t_cursor into @px,@value
end
close t_cursor
deallocate t_cursor

select * from #tmp where px<@px1 order by px

效率可以到达要求,原以为万事大吉,结果提问者认为游标慢,要求不用游标

4、
最后,好汉只能下猛料了

declare @px int,@s int,@m int
set @s=0
set @m=20

select
    @px=case when @s<=@m then px else @px end,
    @s =@s+case when @s<=@m then value else 0 end
from
    (select top 100 percent * from #tmp order by px) a

select * from #tmp where px<@px order by px


总结:
1、对于某些特殊的查询,不能单纯为了图SQL语句简单直观,不能认为简单就效率高,简单就是美,其实查询不是那么简单
2、不要固执的认为游标慢,当然,在与select * from tab where ...等诸多情况比较,游标遍历表确实是效率低一些,然而有些时候,游标的效率不是我们想象中那么差劲的,就比如这

Solr游标查询提高翻页效率

长期以来,我们一直有一个深分页问题。如果直接跳到很靠后的页数,查询速度会比较慢。这是因为Solr的需要为查询从开始遍历所有数据。直到Solr的4.7这个问题一直没有一个很好的解决方案。与最近发布的So...
  • cuichao703
  • cuichao703
  • 2014年08月15日 16:56
  • 2260

走得最慢的人,只要他不丧失目标,也比漫无目的地徘徊的人走得快

最近项目因某些问题要停个几天,也许是前段时间比较忙,突然闲下来,发现不知道要干什么。想学点什么,研究点什么的,也静不下心来。 我发现自己每过段时间,都会有个迷茫期,也不是说迷茫回事坏事。世上只有两种...
  • LonelyRoamer
  • LonelyRoamer
  • 2013年05月09日 21:16
  • 4596

计算机科学-第2周 数组初练-题目

《计算机科学》课程主页在:http://blog.csdn.net/sxhelijian/article/details/13705597练习一:下面的程序,输出了52张扑克牌(如图),请补充完整程序...
  • sxhelijian
  • sxhelijian
  • 2014年03月07日 09:37
  • 1987

谁说菜鸟不会数据分析 高清完整.pdf版

  • 2017年08月21日 18:01
  • 56.07MB
  • 下载

谁说大象不能跳舞

  • 2015年11月13日 14:40
  • 717KB
  • 下载

谁说菜鸟不会数据分析(入门篇)》的配书资料

  • 2015年04月08日 11:13
  • 276KB
  • 下载

谁说菜鸟不会数据分析

  • 2015年03月23日 19:37
  • 56.21MB
  • 下载

谁说菜鸟不会数据分析(入门篇)

  • 2014年08月29日 17:01
  • 38.49MB
  • 下载

《谁说大象不能跳舞》IBM董事长郭士纳自传

  • 2008年11月03日 18:43
  • 267KB
  • 下载

谁说大象不能跳舞PDF(中文版)

  • 2008年09月24日 14:08
  • 671KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谁说游标一定慢?
举报原因:
原因补充:

(最多只允许输入30个字)