選擇合適的游標型別

2021-09-05 16:40:13 字數 1387 閱讀 8098

背景:<?xml:namespace prefix = o />

定義游標的時候

,如果不指定

static

關鍵字的時候

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

(dynamic)的

動態(dynamic

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

absolute

提取選項。

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

,所以對於複雜的查詢

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

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

keyset

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

在筆者遇到的乙個案例中

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

,而改為靜態游標後

,處理時間只需要

1 秒鐘

,效率的差異非常明顯

另外,在使用dynamic

游標的時候

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

下面是乙個看似正常

, 但實際執行會造成死迴圈的示例

setnocount

on--

建立測試環境

declare

@tb table

(id int

primary

key)

insert

@tb(

id)select

id = 1 <?xml:namespace prefix = st1 />union

allselect

id = 2

-- 游標處理

declare

tb cursor

local

fast_forward

for

select

id from @tb

declare

@id int

open

tb

fetch

tb into @id

while

@@fetch_status

= 0

begin

print @id

update @tb set

id = id + 2

where id = @id

fetch tb into @id

endclose

tb

deallocate

tb

選擇合適的游標型別

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

選擇合適的游標型別

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

選擇合適的游標型別

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