【转】游标的开销有多大

新建一个 Table

USE [tempdb]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo]. [Test](

[ID] [int] IDENTITY ( 1, 1) NOT NULL,

[Value] [int] NOT NULL,

CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED

(

[ID] ASC

) WITH ( PAD_INDEX   = OFF , STATISTICS_NORECOMPUTE   = OFF , IGNORE_DUP_KEY = OFF ,ALLOW_ROW_LOCKS   = ON , ALLOW_PAGE_LOCKS   = ON ) ON [PRIMARY]

) ON [PRIMARY]

GO

ALTER TABLE [dbo]. [Test] ADD   CONSTRAINT [DF_Test_Value]  DEFAULT (( 0)) FOR [Value]

GO

插入数据:

Declare @i INT

SET @i = 2

While @i < 10000

BEGIN

INSERT INTO Test( value)

values ( @i)

SET @i = @i + 1

END

用三种方法求和,

第一种,游标:

DECLARE @I INT

DECLARE @Value INT

SET @I = 0

SET @Value = 0

DECLARE C$TestCursor CURSOR FOR

Select Value From test

OPEN C$TestCursor

Select GETDATE ()

FETCH NEXT FROM C$TestCursor INTO @Value

WHILE @@FETCH_STATUS = 0

BEGIN

SET @I = @I + @Value

FETCH NEXT FROM C$TestCursor INTO @Value

END

CLOSE C$TestCursor

DEALLOCATE C$TestCursor

Select GETDATE ()

执行三次:

1 . 2011-03-24 22:39:32.780 , 2011-03-24 22:39:33.217.   437

2 . 2011-03-24 22:40:37.750 , 2011-03-24 22:40:38.187.   437

3 . 2011-03-24 22:40:54.263 , 2011-03-24 22:40:54.717.   454

第二种, WHILE 循环:

DECLARE @MAXID INT

SELECT @MAXID = MAX ( ID) From Test

SELECT GETDATE ()

DECLARE @ID INT

DECLARE @Value INT

SET @ID = 1

SET @Value = 0

WHILE @ID <= @MAXID

BEGIN

IF EXISTS( Select ID From test WHERE ID = @ID)

BEGIN

Select @Value=( @Value+ Value) From test WHERE ID = @ID

END

SET @ID = @ID + 1

END

SELECT GETDATE ()

执行三次:

1 . 2011-03-24 23:12:01.717 , 2011-03-24 23:12:02.043.   326

2 . 2011-03-24 23:13:15.390 , 2011-03-24 23:13:15.717.   327

3 . 2011-03-24 23:13:45.560 , 2011-03-24 23:13:45.890.   330

第三种,聚合函数:

SELECT GETDATE ()

SELECT SUM ( Value) FROM Test

SELECT GETDATE ()

1 . 2011-03-24 23:05:10.170 , 2011-03-24 23:05:10.170

2 , 2011-03-24 23:06:19.840 , 2011-03-24 23:06:19.840

3 . 2011-03-24 23:06:31.623 , 2011-03-24 23:06:31.623

尽量不要使用游标,尽量用连接或者集合操作 ( joins / set operations ) 来实现,即使是 WHILE 都有可能比游标快。

时间: 2024-11-07 03:31:26

【转】游标的开销有多大的相关文章

MySQL数据库高级(九)——游标

MySQL数据库高级(九)--游标 一.游标简介 1.游标简介 游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果.游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.尽管游标能遍历结果中的所有行,但一次只指向一行.游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作. 2.游标的特性 游标具有三个属性:A.不敏感(Asensitive):数据库可以选择不复制结果集B.只读(Read only)C.不滚动(Nonscrollable):游标只能向一个方向

效率和开销问题是递归最大的缺点

递归在解决某些问题的时候使得我们思考的方式得以简化,代码也更加精炼,容易阅读.那么既然递归有这么多的优点,我们是不是什么问题都要用递归来解决呢?难道递归就没有缺点吗?今天我们就来讨论一下递归的不足之处.谈到递归就不得不面对它的效率问题. 为什么递归是低效的 还是拿斐波那契(Fibonacci)数列来做例子大发888娱乐城.在很多教科书或文章中涉及到递归或计算复杂性的地方都会将计算斐波那契数列的程序作为经典示例.如果现在让你以最快的速度用C#写出一个计算斐波那契数列第n个数的函数(不考虑参数小于1

《SPARK/TACHYON:基于内存的分布式存储系统》-史鸣飞(英特尔亚太研发有限公司大数据软件部工程师)

史鸣飞:大家好,我是叫史鸣飞,来自英特尔公司,接下来我向大家介绍一下Tachyon.我事先想了解一下大家有没有听说过Tachyon,或者是对Tachyon有没有一些了解?对Spark呢? 首先做一个介绍,我来自英特尔的大数据团队,我们团队主要是致力于各种大数据的软件开发以及这些软件在工业界的推广和应用,我所在的团队主要负责Spark及其软件栈的开发和推广.我们是国内最早参加Spark开发和推广的团队,我们在2012年就加入了Spark社区.在Spark和相关的项目中间投入了大量的人力,长期以来我

MySQL的SSL加密连接与性能开销

前言 在生产环境下,安全总是无法忽视的问题,数据库安全则是重中之重,因为所有的数据都存放在数据库中.MySQL在5.7版本之前对于安全问题的确考虑并不充分,导致存在比较大的隐患,比如下面的这些问题,可能有些小伙伴知道,有些却还不知道: MySQL数据库默认安装的用户密码为空 所有用户拥有对于MySQL默认安装test数据库的访问权限(即使没有授予权限) 好在Oracle官方也已经意识到安全的重要性,MySQL 5.7开始安装完成后的root用户的密码不再是空,而是在安装时随机产生一个密码,这也导

大数据处理系列之(一)Java线程池使用

前言:最近在做分布式海量数据处理项目,使用到了java的线程池,所以搜集了一些资料对它的使用做了一下总结和探究, 前面介绍的东西大多都是从网上搜集整理而来.文中最核心的东西在于后面两节无界队列线程池和有界队列线程池的实例 使用以及线上问题处理方案. 1.  为什么要用线程池? 在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的.在实际使用中,每个请求创建新线程的服务器 在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在实际处理实际的用户请求的时间和资源要多的多.除 了

Mysql千万级大表优化

Mysql的单张表的最大数据存储量尚没有定论,一般情况下mysql单表记录超过千万以后性能会变得很差.因此,总结一些相关的Mysql千万级大表的优化策略. 1.优化sql以及索引 1.1优化sql 1.有索引但未被用到的情况(不建议) (1)避免like的参数以通配符开头时 尽量避免Like的参数以通配符开头,否则数据库引擎会放弃使用索引而进行全表扫描. 以通配符开头的sql语句,例如:select * from t_credit_detail where Flistid like '%0'\G

转帖--计算机网络基础知识大总汇 https://www.jianshu.com/p/674fb7ec1e2c?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation

计算机网络基础知识大总汇 龙猫小爷 关注 2016.09.14 23:01* 字数 12761 阅读 30639评论 35喜欢 720 一.什么是TCP/IP 网络和协议 1.     TCP/IP是一类协议系统,它是一套支持网络通信的协议集合.网络是计算机或类似计算机的设备之间通过常用的传输介质进行通信的集合. 2.     网络协议就是一套通用规则,用来帮助定义复杂数据传输的过程.数据传输从一台计算机上的应用程序开始,通过计算机网络硬件,经过传输介质到正确目的地,然后上传到目的地计算机网络硬

python3 线程比进程的开销小

# -*- coding: utf-8 -*- from threading import Thread def func(name): print("子线程: %s" %name) if __name__ == '__main__': t = Thread(target=func, args=("lily",)) t.start() print("主线程") # 子线程: lily # 主线程 # -*- coding: utf-8 -*- f

Linux fork那些隐藏的开销

fork是一个拥有50年历史的陈年系统调用,它是一个传奇!时至今日,它依旧灿烂. 一个程序员可以永远不用read/write,也可以不懂mmap,但必须懂fork.这是一种格调! fork没有参数,它是如此简单,是UNIX哲学的布道者或者说卫道者们的首选,它被写进了几乎每一本操作系统教科书里,成了 创建新进程的绝佳范式 ,fork站在原地,似乎在闭着眼睛蔑视 Windows的CreateProcess ,它的参数是如此之多,如此之复杂,在UNIX的世界,简单就是一切! 然而UNIX却不是整个世界