背景:
定義游標的時候
,如果不指定
static
關鍵字的時候
,則預設定義的游標是動態
(dynamic)的
動態(dynamic
)游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的資料值、順序和成員身份在每次提取時都會更改。動態游標不支援
absolute
提取選項。
因為動態游標會消耗資源去檢查基礎表的更新
,所以對於複雜的查詢
,且不需要反映基礎表更新情況的游標處理中
,將游標定義為靜態的。另外,還有一種
keyset
型別的游標,它的行為介於動態和靜態游標之間。
在筆者遇到的乙個案例中
,使用動態游標的處理會花費分鐘
,而改為靜態游標後
,處理時間只需要
1 秒鐘
,效率的差異非常明顯
另外,在使用
dynamic
游標的時候
,必須注意「行的資料值、順序和成員身份在每次提取時都會更改」的問題。
下面是乙個看似正常
, 但實際執行會造成死迴圈的示例
setnocount
on--
建立測試環境
declare
@tb table
(
id int
primary
key)
insert
@tb(
id)
select
id = 1
union
all
select
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 提取選項。因為動態游標會消耗資源...