游标的开销有多大

<![endif]-->

新建一个 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 都有可能比游标快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值