選擇合適的游標型別

2021-08-22 08:07:46 字數 1246 閱讀 8771

背景:

定義游標的時候,

如果不指定static

關鍵字的時候,

則預設定義的游標是動態(

dynamic)的

動態(dynamic

)游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的資料值、順序和成員身份在每次提取時都會更改。動態游標不支援absolute

提取選項。

因為動態游標會消耗資源去檢查基礎表的更新,

所以對於複雜的查詢,

且不需要反映基礎表更新情況的游標處理中,

將游標定義為靜態的。另外,還有一種keyset

型別的游標,它的行為介於動態和靜態游標之間。

在筆者遇到的乙個案例中,

使用動態游標的處理會花費分鐘,

而改為靜態游標後,

處理時間只需要1 秒鐘,

效率的差異非常明顯

另外,在使用dynamic

游標的時候,

必須注意「行的資料值、順序和成員身份在每次提取時都會更改」的問題。

下面是乙個看似正常, 但實際執行會造成死迴圈的示例

setnocount

on-- 建立測試環境

declare

@tb table

(id int

primary

key)

insert

@tb(

id)select

id = 1 union

allselect

id = 2

-- 游標處理

declare

tb cursor

local

fast_forward

for

select

id from @tb

declare

@id int

opentb

fetch

tb into @id

while

@@fetch_status

= 0

begin

print @id

update @tb set

id = id + 2

where id = @id

fetch tb into @id

endclosetb

deallocatetb

選擇合適的游標型別

背景 定義游標的時候 如果不指定 static 關鍵字的時候 則預設定義的游標是動態 dynamic 的 動態 dynamic 游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的資料值 順序和成員身份在每次提取時都會更改。動態游標不支援 absolute 提取選項。因為動態游標會消耗資源...

選擇合適的游標型別

背景 定義游標的時候 如果不指定 static 關鍵字的時候 則預設定義的游標是動態 dynamic 的 動態 dynamic 游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的資料值 順序和成員身份在每次提取時都會更改。動態游標不支援 absolute 提取選項。因為動態游標會消耗資源...

選擇合適的游標型別

背景 定義游標的時候 如果不指定 static 關鍵字的時候 則預設定義的游標是動態 dynamic 的 動態 dynamic 游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的資料值 順序和成員身份在每次提取時都會更改。動態游標不支援 absolute 提取選項。因為動態游標會消耗資源...