背景:
定義游標的時候,
如果不指定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 提取選項。因為動態游標會消耗資源...