【轉】遊標的開銷有多大

來源:互聯網
上載者:User

標籤:io   ar   os   使用   sp   for   on   資料   bs   

建立一個 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 都有可能比遊標快。

【轉】遊標的開銷有多大

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.