谁说游标一定慢?

Sqlserver 游标 慢 .net项目中有个模块做统计功能,原先方法速度很慢,所以需要改进,统计结果如下图: 下图接上图后面: 原先的处理方式是,这些数据分别涉及到四五张表,前台从数据库中查询出需要的数据集,然后分别遍历这些数据集拼接html字符串显示在界面上。 优化思考: 由于前台需要多次调用数据库,试想把改功能封装成一个存储过程实现,前台负责传输参数,有存储过程计算拼接之后返回html结果。 其实对于 阅读详情

昨天在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 ...等诸多情况比较,游标遍历表确实是效率低一些,然而有些时候,游标的效率不是我们想象中那么差劲的,就比如这 

oracle: 游标,父游标,子游标,游标相关视图 1       PL/SQL(Procedural language /SQL) PL/SQL是一种程序语言。 是过程化的SQL语言。Procedurallanguage /SQL 是oracle数据库对SQL语言的扩展。 在普通的SQL上增加了编程语言的特点。 可以把数据操作和查询语句组织在PL/SQL代码的过程性单元中,以实现复杂的功能   2       游标(cu 阅读详情

相关推荐

从零搭建Synopsys EDA环境:Ubuntu系统下的完整安装与避坑指南

本文详细介绍了在Ubuntu系统下从零搭建Synopsys EDA环境的完整流程,包括系统配置、安装文件准备、核心工具安装、License配置及常见问题排查。特别针对数字IC设计场景,提供了VCS、Verdi、Design Compiler等EDA Tools的安装避坑指南和性能优化建议,帮助开发者高效搭建稳定的开发环境。

weixin_33738982的博客 491

Oracle 游标越大,打开的越慢,可以的话,游标定义只需要用到的列

也是300万数据的一张表: --只游标定义一列 declare     cursor cur_3 is select a.cert_type from ea_cust.cust_info a;     type t_table is table of varchar2(100);     c_table t_table;     to_cust_id varchar2(100);

ghostgant的专栏 3983

高分影像批处理第三回——RPC文件与几何校正

前言 前面两章部分完成了图像的基本组织和大气校正,可是对于遥感影像地理相关数据,精确的地理坐标也是非常关键的。L1级数据,可惜,并没有帮我们处理地理坐标系统。无论是打开ENVI还是用gdal工具查看图像元数据,其坐标系统都是错误的或者说是未读入的。因此本章节来解决这个问题。

weixin_43762038的博客 1万+

游标循环 查询和更新是很慢的一件事情

最近赶个项目,里面要统计末末的属性  Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

海鲨数据库架构师 2484

避坑指南:PVE下N卡直通错误代码43的终极解决思路与dmesg日志分析

本文详细解析了PVE环境下NVIDIA显卡直通时遇到的错误代码43问题,提供了从dmesg日志分析到BIOS配置、PVE宿主机优化及虚拟机设置的完整解决方案。特别针对GTX1060等显卡,分享了驱动版本选择、ROM修补及高级排错技巧,帮助用户彻底解决这一常见难题。

weixin_28693683的博客 288

Windows系统下搭建MPI(并行计算)环境

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;W

weixin_43417960的博客 5752

PB游标编程套路

String ls_temp1 String ls_temp2 declare cur_name CURSOR FOR select field1,field2 from tablename where condition OPEN cur_name; FETCH cur_name INTO :ls_temp1,:ls_temp2; do while sqlca.sqlcode = ...

web开发自学 229

基于YOLO的智能视频监控异常行为检测研究:从算法原理到落地部署的全栈实践

本文深入探讨如何利用 YOLO(You Only Look Once)系列算法构建一套端到端的异常行为检测系统。文章首先回顾 YOLOv8 在时空建模上的局限,然后提出“YOLO-STA(Spatio-Temporal Aggregation)”轻量级改进框架,在公开数据集 UCF-Crime 上将异常行为检测的 mAP@0.5 从 72.4 提升到 80.1;接着给出完整训练、推理、部署的 Python 代码(PyTorch + TensorRT),并介绍如何仅用 4 GB 显存的 Jetson Xavi

博客 1321

存储过程中 Fetch Next 的性能改善

 实际应用过程中,发现游标第二次执行FETCH NEXT FROM cur INTO 时间相当慢,不知道其原理会不会是重新执行了一次原来的SELECT语句再把游标指到下一行,为了解决这一问题,想到把SELECT的结果先存放到临时表,再用游标去检索,性能会改善很多。     create table #Tmp --创建临时表#Tmp  (      ……   );   INSE

崇鱼工作手册 2370

stata 工具变量法【计量经济系列(七)】

stata 工具变量法【计量经济系列(七)】 1. 内生性 2. 工具变量3. 2SLS (二阶段最小二乘法) 4. 弱工具变量5. 工具变量外生性的过度识别检验 6. 豪斯曼检验6.1 传统豪斯曼 6.2 杜宾-吴-豪斯曼检验(DWH)

侯小啾技术博客 2万+

Python爬虫实战:深度解析B站弹幕异步采集技术与数据可视化

title=f"弹幕词云 Top 100 (BV: {bvid})", title_textstyle_opts=opts.TextStyleOpts(font_size=23).add(series_name="弹幕词云", data_pair=list(top_100_words.items()), word_size_range=[20, 100]).add_xaxis([f"{i}-{i+1}分" for i in range(len(time_distribution))])

2201_76125261的博客 640

ORACLE游标详解

Oracle游标

JF的博客 1万+

基于深度学习的野生菌菇检测识别分类系统(YOLOv8 + UI界面 + 数据集)

随着深度学习技术的迅猛发展,计算机视觉领域的应用得到了广泛的关注。野生菌菇的检测与识别是一个复杂而又有趣的问题,涉及到物体检测、图像分类以及自然语言处理等技术。本文将介绍如何基于YOLOv8模型,结合自定义UI界面与数据集,构建一个高效且精确的野生菌菇检测识别分类系统。首先,我们将介绍YOLOv8的原理与特点,然后详细描述如何构建和训练野生菌菇识别模型,并介绍如何为该系统设计UI界面,最终形成一个完整的系统。本文内容包括代码实现、模型训练及数据集准备等,旨在为有类似需求的开发者提供参考和帮助。目录摘要目录。

YOLO 1546

oracle 用游标为什么会比for循环慢?

在Oracle中,使用游标(Cursor)相比于FOR循环可能会显得较慢,这主要是由于它们的设计目的和使用场景的不同所导致的。

weixin_41203765的博客 1279

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Oracle】游标 显式游标与隐式游标

在使用SQL语句进行查询时,获得和处理的结果是整个查询结果集,若需要进一步查询结果中的每条数据进行业务操作,仅靠SQL语句则无法实现,所以PL/SQL提出游标概念解决此类问题。 游标是一种特殊的指针,提供了对一个结果集进行逐行处理的能力。使用游标可以对结果集按行、按条件进行数据的提取、修改和删除操作。在物理结构上,游标是Oracle为用户开设的一个数据缓冲区,存放SQL语句的执行结果。 在Oracle数据库中执行的每个SQL语句都有对应的单独的游标。Oracle主要由以下两种游标类型:游标主要用于对结果集中

奥利文儿的博客 4518

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

显示游标、隐式游标、高级游标

一。游标 1.定义: 游标是Oracle服务器为SQL语句建立的一个私有的SQL工作区。 2.种类: 显示游标:由编程者明确指定。 隐式游标:在缺省情况下,Oracle服务器以隐式游标来编译和执行SQL。 3.SQL游标属性: 使用SQL游标属性,可以测试SQL语句的输出。 游标属性 说明 SQL%ROWCOUNT 最后依次执行的SQL语句所影响到的数据行(一个整数值),几条数据受...

故园 3686

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

游标(概念、优点、分类、静态游标的使用(显示游标(显示游标的属性、遍历显示游标、显示游标的FOR循环)、隐式游标(隐式游标的属性))、动态游标的使用、静态游标和动态游标的区别、更新或删除当前游标数据

如前所述,

weixin_43809550的博客 3774

mysql游标很慢_Sqlserver 游标 慢

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

weixin_30166291的博客 866

ORACLE PL/SQL编程之四:把游标说透

ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理隐式游标 4.1.3 关于 NO_DATA_FOUND 和 %NOTFOUND的区别 4.1.4  使用游标更新和删除数据 4.2 游标变量 4.2.1  声明游标变量 4.2

Allen的专栏 1345

Oracle 把游标说透

本篇主要内容如下: 4.1游标概念 4.1.1处理显式游标 4.1.2处理隐式游标 4.1.3关于NO_DATA_FOUND和%NOTFOUND的区别 4.1.4使用游标更新和删除数据 4.2游标变量 4.2.1声明游标变量 4.2.2游标变量操作 游标的使用 在PL/SQL程序中,对于处理多行记录的事务经常使用游标来实现。 4.1游标概念 在PL...

u014712365的博客 127

【Oracle】PL/SQL 显式游标、隐式游标、动态游标

在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。 在每个用户会话中,可以同时打开多个游标,其数量由数据库初始化参数文件中的OPEN_CURSORS参数定义。 对于不同的SQL语句,游标的使用

Alpha's 学习笔记 1万+

Oracle游标

Oracle游标

雷神乐乐的博客 1385

PLSQL——游标(显式游标、隐式游标、REF游标)

游标逐行处理查询结果,以编程的方式访问数据它实际上是一个指针,它在一段Oracle存放数据查询结果集或数据操作结果集的内存中(数据的缓存区),游标就是指向这个缓冲区的一个指针。

m0_72036727的博客 2214

ORACLE PL/SQL编程详解之四:把游标说透

本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理隐式游标 4.1.3 关于 NO_DATA_FOUND 和 %NOTFOUND的区别 4.1.4  使用游标更新和删除数据 4.2 游标变量 4.2.1  声明游标变量 4.2.2  游标变量操作   游标的使用     在 PL

Max一直在学习 1355
上一篇: 比较复杂的动态SQL语句功能一例
下一篇: 男人在拥有了女人之后……
michael200801
博客等级 码龄19年 39粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值