久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQL Server游標的使用/關閉/釋放/優(yōu)化是怎樣的

157次閱讀
沒有評論

共計 2773 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關 SQL Server 游標的使用 / 關閉 / 釋放 / 優(yōu)化是怎樣的,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

游標是邪惡的!

在關系數(shù)據(jù)庫中,我們對于查詢的思考是面向集合的。而游標打破了這一規(guī)則,游標使得我們思考方式變?yōu)橹鹦羞M行. 對于類 C 的開發(fā)人員來著,這樣的思考方式會更加舒服。

正常面向集合的思維方式是:

而對于游標來說:

這也是為什么游標是邪惡的,它會使開發(fā)人員變懶,懶得去想用面向集合的查詢方式實現(xiàn)某些功能.

同樣的,在性能上,游標會吃更多的內存,減少可用的并發(fā),占用寬帶,鎖定資源,當然還有更多的代碼量……

從游標對數(shù)據(jù)庫的讀取方式來說,不難看出游標為什么占用更多的資源,打個比方:

當你從 ATM 取錢的時候,是一次取 1000 效率更高呢,還是取 10 次 100?

既然游標這么“邪惡”,為什么還要學習游標

我個人認為存在既是合理. 歸結來說,學習游標原因我歸納為以下 2 點

1. 現(xiàn)存系統(tǒng)有一些游標,我們查詢必須通過游標來實現(xiàn)

2. 作為一個備用方式,當我們窮盡了 while 循環(huán), 子查詢,臨時表,表變量, 自建函數(shù)或其他方式扔來無法實現(xiàn)某些查詢的時候,使用游標實現(xiàn).

T-SQL 中游標的生命周期以及實現(xiàn)

在 T -SQL 中,游標的生命周期由 5 部分組成

1. 定義一個游標

在 T -SQL 中,定義一個游標可以是非常簡單,也可以相對復雜,取決于游標的參數(shù). 而游標的參數(shù)設置取決于你對游標原理的了解程度.

游標其實可以理解成一個定義在特定數(shù)據(jù)集上的指針,我們可以控制這個指針遍歷數(shù)據(jù)集,或者僅僅是指向特定的行,所以游標是定義在以 Select 開始的數(shù)據(jù)集上的:

T-SQL 中的游標定義在 MSDN 中如下:

DECLARE cursor_name CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING] FOR select_statement [FOR UPDATE [ OF column_name [ ,…n] ] ][;]

看起來很讓人頭痛是吧. 下面仔細講一下如何定義游標:

游標分為游標類型和游標變量,對于游標變量來說,遵循 T -SQL 變量的定義方法(啥,不知道 T -SQL 變量定義的規(guī)則?參考我前面的博文). 游標變量支持兩種方式賦值,定義時賦值和先定義后賦值,定義游標變量像定義其他局部變量一樣,在游標前加”@”, 注意,如果定義全局的游標,只支持定義時直接賦值,并且不能在游標名稱前面加“@”,兩種定義方式如下:

下面我們來看游標定義的參數(shù):

LOCAL 和 GLOBAL 二選一

LOCAL 意味著游標的生存周期只在批處理或函數(shù)或存儲過程中可見,而 GLOBAL 意味著游標對于特定連接作為上下文,全局內有效, 例如:

如果不指定游標作用域,默認作用域為 GLOBAL

FORWARD_ONLY 和 SCROLL 二選一

FORWARD_ONLY 意味著游標只能從數(shù)據(jù)集開始向數(shù)據(jù)集結束的方向讀取,F(xiàn)ETCH NEXT 是唯一的選項,而 SCROLL 支持游標在定義的數(shù)據(jù)集中向任何方向,或任何位置移動,如下圖:

STATIC KEYSET DYNAMIC 和 FAST_FORWARD 四選一

這四個關鍵字是游標所在數(shù)據(jù)集所反應的表內數(shù)據(jù)和游標讀取出的數(shù)據(jù)的關系

STATIC 意味著,當游標被建立時,將會創(chuàng)建 FOR 后面的 SELECT 語句所包含數(shù)據(jù)集的副本存入 tempdb 數(shù)據(jù)庫中,任何對于底層表內數(shù)據(jù)的更改不會影響到游標的內容.

DYNAMIC 是和 STATIC 完全相反的選項, 當?shù)讓訑?shù)據(jù)庫更改時,游標的內容也隨之得到反映,在下一次 fetch 中,數(shù)據(jù)內容會隨之改變

KEYSET 可以理解為介于 STATIC 和 DYNAMIC 的折中方案。將游標所在結果集的唯一能確定每一行的主鍵存入 tempdb, 當結果集中任何行改變或者刪除時,@@FETCH_STATUS 會為 -2,KEYSET 無法探測新加入的數(shù)據(jù)

FAST_FORWARD 可以理解成 FORWARD_ONLY 的優(yōu)化版本.FORWARD_ONLY 執(zhí)行的是靜態(tài)計劃,而 FAST_FORWARD 是根據(jù)情況進行選擇采用動態(tài)計劃還是靜態(tài)計劃,大多數(shù)情況下 FAST_FORWARD 要比 FORWARD_ONLY 性能略好.

READ_ONLY SCROLL_LOCKS OPTIMISTIC 三選一 READ_ONLY 意味著聲明的游標只能讀取數(shù)據(jù), 游標不能做任何更新操作

SCROLL_LOCKS 是另一種極端,將讀入游標的所有數(shù)據(jù)進行鎖定,防止其他程序進行更改,以確保更新的絕對成功

OPTIMISTIC 是相對比較好的一個選擇,OPTIMISTIC 不鎖定任何數(shù)據(jù),當需要在游標中更新數(shù)據(jù)時, 如果底層表數(shù)據(jù)更新,則游標內數(shù)據(jù)更新不成功,如果,底層表數(shù)據(jù)未更新,則游標內表數(shù)據(jù)可以更新

2. 打開游標

當定義完游標后,游標需要打開后使用,只有簡單一行代碼:

OPEN test_Cursor

注意,當全局游標和局部游標變量重名時,默認會打開局部變量游標

3. 使用游標

游標的使用分為兩部分, 一部分是操作游標在數(shù)據(jù)集內的指向,另一部分是將游標所指向的行的部分或全部內容進行操作

只有支持 6 種移動選項, 分別為到第一行(FIRST), 最后一行 (LAST), 下一行 (NEXT), 上一行 (PRIOR), 直接跳到某行 (ABSOLUTE(n)), 相對于目前跳幾行 (RELATIVE(n)), 例如:

對于未指定 SCROLL 選項的游標來說,只支持 NEXT 取值.

第一步操作完成后,就通過 INTO 關鍵字將這行的值傳入局部變量:

比如下面代碼:

游標經(jīng)常會和全局變量 @@FETCH_STATUS 與 WHILE 循環(huán)來共同使用, 以達到遍歷游標所在數(shù)據(jù)集的目的, 例如:

4. 關閉游標

在游標使用完之后,一定要記得關閉, 只需要一行代碼:CLOSE+ 游標名稱

CLOSE test_Cursor

5. 釋放游標

當游標不再需要被使用后,釋放游標,只需要一行代碼:DEALLOCATE+ 游標名稱

DEALLOCATE test_Cursor

對于游標一些優(yōu)化建議

如果能不用游標,盡量不要使用游標用完用完之后一定要關閉和釋放盡量不要在大量數(shù)據(jù)上定義游標盡量不要使用游標上更新數(shù)據(jù)盡量不要使用 insensitive, static 和 keyset 這些參數(shù)定義游標如果可以,盡量使用 FAST_FORWARD 關鍵字定義游標如果只對數(shù)據(jù)進行讀取,當讀取時只用到 FETCH NEXT 選項,則最好使用 FORWARD_ONLY 參數(shù)。

關于 SQL Server 游標的使用 / 關閉 / 釋放 / 優(yōu)化是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-07-18發(fā)表,共計2773字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網(wǎng)絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 宕昌县| 田东县| 准格尔旗| 合水县| 嵊州市| 察哈| 塔河县| 长兴县| 禹州市| 四会市| 昆山市| 邢台县| 凉山| 张掖市| 定边县| 蕉岭县| 灵武市| 蕲春县| 繁昌县| 古浪县| 高邮市| 务川| 北宁市| 象州县| 澄江县| 海阳市| 玛曲县| 浑源县| 大洼县| 旌德县| 永州市| 玉溪市| 彭水| 佛坪县| 西城区| 泸水县| 蒙自县| 荆州市| 通州市| 贵港市| 尚志市|