【轉】靜態資料指標和動態資料指標

來源:互聯網
上載者:User

標籤:ar   os   使用   sp   for   strong   on   資料   問題   

靜態資料指標在開啟時會將資料集儲存在tempdb中,因此顯示的資料與遊標開啟時的資料集保持一致,在遊標開啟以後對資料庫的更新不會顯示在遊標中。

 

動態資料指標在開啟後會反映對資料庫的更改。所有UPDATE、INSERT 和 DELETE 操作都會顯示在遊標的結果集中,結果集中的行資料值、順序和成員在每次提取時都會改變。

 

在定義遊標的時候如果不指定STATIC關鍵字,預設是DYNAMIC的。

 

動態資料指標的開啟速度比靜態資料指標的開啟速度快。當開啟靜態資料指標時,必鬚生成內部臨時工作表,而動態資料指標則不需要。

 

在聯結中,靜態資料指標的速度可能比動態資料指標的速度快。因為動態資料指標在滾動時反應對結果集內的各行資料所做的更改,它會消耗資源去檢測基表的更改,因此對於複雜的查詢,且不需要反映基表的更新的遊標的處理應將其定義為靜態資料指標。

 

如果要進行絕對提取,必須使用索引鍵集驅動資料指標或靜態資料指標。

 

在使用動態資料指標時,應該注意行資料的更新所導致的死迴圈等問題,如下表所示:

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE TABLE [dbo].[Test](

      [ID] [int] NOT NULL,

 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([ID] ASC)) ON [PRIMARY]

 

GO

 

 

INSERT INTO Test VALUES(1)

GO

 

DECLARE C$Cursor Cursor

FOR

SELECT ID From Test Where ID < 10

 

DECLARE @id INT

 

OPEN C$Cursor

Fetch  C$Cursor INTO @id

 

WHILE @@FETCH_STATUS = 0

BEGIN

      UPDATE Test SET ID = ID + 1 WHERE id = @id

      Fetch  C$Cursor INTO @id

END

 

CLOSE C$Cursor

DEALLOCATE C$Cursor

 

 

執行完後表中的數值變成了10,代表更新行執行了多次。如果把遊標的定義改成如下:

DECLARE C$Cursor Cursor STATIC

FOR

SELECT ID From Test Where ID < 10

則執行結果為2

【轉】靜態資料指標和動態資料指標

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.