程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server游標的應用/封閉/釋放/優化小結

SQL Server游標的應用/封閉/釋放/優化小結

編輯:MSSQL

SQL Server游標的應用/封閉/釋放/優化小結。本站提示廣大學習愛好者:(SQL Server游標的應用/封閉/釋放/優化小結)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server游標的應用/封閉/釋放/優化小結正文


游標是險惡的!

在關系數據庫中,我們關於查詢的思慮是面向聚集的。而游標打破了這一規矩,游標使得我們思慮方法變成逐行停止.關於類C的開辟人員來著,如許的思慮方法會加倍舒暢。

正常面向聚集的思想方法是:

2

而關於游標來講:

3

這也是為何游標是險惡的,它會使開辟人員變懶,懶得去想用面向聚集的查詢方法完成某些功效.

異樣的,在機能上,游標會吃更多的內存,削減可用的並發,占用寬帶,鎖定資本,固然還有更多的代碼量……

從游標對數據庫的讀取方法來講,不好看出游標為何占用更多的資本,打個比喻:

   1

當你從ATM取錢的時刻,是一次取1000效力更高呢,照樣取10次100?

既然游標這麼“險惡”,為何還要進修游標

我小我以為存在既是公道.歸結來講,進修游標緣由我歸結為以下2點

1.現存體系有一些游標,我們查詢必需經由過程游標來完成

2.作為一個備用方法,當我們窮盡了while輪回,子查詢,暫時表,表變量,自建函數或其他方法扔來沒法完成某些查詢的時刻,應用游標完成.

T-SQL中游標的性命周期和完成

在T-SQL中,游標的性命周期由5部門構成

1.界說一個游標

在T-SQL中,界說一個游標可所以異常簡略,也能夠絕對龐雜,取決於游標的參數.而游標的參數設置取決於你對游標道理的懂得水平.

游標其實可以懂得成一個界說在特定數據集上的指針,我們可以掌握這個指針遍歷數據集,或許僅僅是指向特定的行,所以游標是界說在以Select開端的數據集上的:

4

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變量界說的規矩?參考我後面的博文).游標變量支撐兩種方法賦值,界說時賦值和先界說後賦值,界說游標變量像界說其他部分變量一樣,在游標前加”@”,留意,假如界說全局的游標,只支撐界說時直接賦值,而且不克不及在游標稱號後面加“@”,兩種界說方法以下:

5

上面我們來看游標界說的參數:

LOCAL和GLOBAL二選一

LOCAL意味著游標的生計周期只在批處置或函數或存儲進程中可見,而GLOBAL意味著游標關於特定銜接作為高低文,全局內有用,例如:

6

假如不指定游標感化域,默許感化域為GLOBAL

FORWARD_ONLY 和 SCROLL 二選一

FORWARD_ONLY意味著游標只能從數據集開端向數據集停止的偏向讀取,FETCH NEXT是獨一的選項,而SCROLL支撐游標在界說的數據集中向任何偏向,或任何地位挪動,以下圖:

7

    

STATIC  KEYSET  DYNAMIC  和 FAST_FORWARD 四選一

這四個症結字是游標地點數據集所反響的表內數據和游標讀掏出的數據的關系

STATIC意味著,當游標被樹立時,將會創立FOR前面的SELECT語句所包括數據集的正本存入tempdb數據庫中,任何關於底層表內數據的更改不會影響到游標的內容.

DYNAMIC是和STATIC完整相反的選項,當底層數據庫更改時,游標的內容也隨之獲得反應,鄙人一次fetch中,數據內容會隨之轉變

KEYSET可以懂得為介於STATIC和DYNAMIC的折衷計劃。將游標地點成果集的獨一能肯定每行的主鍵存入tempdb,當成果集中任何行轉變或許刪除時,@@FETCH_STATUS會為-2,KEYSET沒法探測新參加的數據

FAST_FORWARD可以懂得成FORWARD_ONLY的優化版本.FORWARD_ONLY履行的是靜態籌劃,而FAST_FORWARD是依據情形停止選擇采取靜態籌劃照樣靜態籌劃,年夜多半情形下FAST_FORWARD要比FORWARD_ONLY機能略好.

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

SCROLL_LOCKS是另外一種極端,將讀入游標的一切數據停止鎖定,避免其他法式停止更改,以確保更新的相對勝利

OPTIMISTIC是絕對比擬好的一個選擇,OPTIMISTIC不鎖定任何數據,當須要在游標中更新數據時,假如底層表數據更新,則游標內數據更新不勝利,假如,底層表數據未更新,則游標內表數據可以更新

  

2.翻開游標

當界說完游標後,游標須要翻開後應用,只要簡略一行代碼:

OPEN test_Cursor

留意,當全局游標和部分游標變量重名時,默許會翻開部分變量游標

3.應用游標

   游標的應用分為兩部門,一部門是操作游標在數據集內的指向,另外一部門是將游標所指向的行的部門或全體內容停止操作

   只要支撐6種挪動選項,分離為到第一行(FIRST),最初一行(LAST),下一行(NEXT),上一行(PRIOR),直接跳到某行(ABSOLUTE(n)),絕對於今朝跳幾行(RELATIVE(n)),例如:

8

關於未指定SCROLL選項的游標來講,只支撐NEXT取值.

第一步操作完成後,就經由過程INTO症結字將這行的值傳入部分變量:

好比上面代碼:

10

9

游標常常會和全局變量@@FETCH_STATUS與WHILE輪回來配合應用,以到達遍歷游標地點數據集的目標,例如:

11

4.封閉游標

在游標應用完以後,必定要記得封閉,只須要一行代碼:CLOSE+游標稱號

CLOSE test_Cursor

5.釋放游標

當游標不再須要被應用後,釋放游標,只須要一行代碼:DEALLOCATE+游標稱號

DEALLOCATE test_Cursor

關於游標一些優化建議

假如能不消游標,盡可能不要應用游標用完用完以後必定要封閉和釋放盡可能不要在年夜量數據上界說游標盡可能不要應用游標上更新數據盡可能不要應用insensitive, static和keyset這些參數界說游標假如可以,盡可能應用FAST_FORWARD症結字界說游標假如只對數據停止讀取,當讀取時只用到FETCH NEXT選項,則最好應用FORWARD_ONLY參數

總結

本文從游標的根本概念,到性命周期來談游標。游標長短常險惡的一種存在,應用游標常常會比應用面向聚集的辦法慢2-3倍,當游標界說在年夜數據量時,這個比例還會增長。假如能夠,盡可能應用while,子查詢,暫時表,函數,表變量等來替換游標,記住,游標永久只是你最初無法之下的選擇,而不是首選。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved