指標 (資料庫)
資料指標(Data Cursor) 是一種在資料庫引擎 (Database Engine) 中,用來處理結果集中資料列移動的一種結構,它可以讓開發人員或資料庫管理員作為資料集 (Resultset) 中瀏覽資料列的一種工具,通常也被外部的資料存取介面所使用,像是 ADO、JDBC 和 ADO.NET 都有應用到資料游標。
原理
資料游標是在資料庫產生結果集時,由資料庫引擎所產生的一個指標,用來指示目前正在存取的結果集的位置,經由這個游標,可以得到結果集中的資料列,並且可以依照需求來移動,但由於游標會佔用伺服器的資源,並且在游標開啟期間會啟用共用鎖定(Shared Lock),在多人使用的系統中容易造成死結的問題,因此目前大部份的應用程式都是使用僅前移型游標 (Forward-Only Cursor)。
種類
依照游標的功能來分,可以分為四種[1]。
靜態游標
靜態游標 (Static Cursor) 是利用暫存資料表作為儲存結果集空間的一種游標,它可以讓應用程式可以快速的存取結果集,但在靜態游標開啟期間,任何對資料表所做的變更都不會反映在結果集中;同時,在靜態游標中所作的修改,無法反映到資料庫中,此種游標是消耗資源度第三的游標。
動態游標
動態游標 (Dynamic Cursor) 是可以反映資料庫中修改的一種游標,不過它並不會讓結果集的位置固定 (隨機變動),因此無法確實的以游標位置來判斷資料,並且它因為要隨時反映資料庫的變化,因此伺服器需要消耗較多的資源,此種游標是消耗資源第二高的游標。
索引鍵集型游標
索引鍵集游標 (Keyset Cursor) 是動態游標的強化版本,藉由維護一個資料集位置對應表 (以 SQL Server 為例,會建立在 tempdb 的 keyset 資料表中),以維護在結果集中的順序不受更新而變化,但這相對的也付出了伺服器效能和資源消耗的代價,因此索引鍵集游標是最消耗伺服器資源的一種游標,在實務上應避免使用。
僅前移型游標
僅前移型游標 (Forward-Only Cursor) 是一旦將游標往前移時,其走過的游標之前的結果集就會被捨棄,因此應用程式不能再往後移動游標,但也因此讓伺服器只需要記住游標在結果集中目前的位置即可,這讓它消耗的資源只有游標而已,是最省資源的一種游標,在實務中被廣泛使用,像 ADO.NET 的 DataReader 就只限定只能使用 Forward-Only Cursor。
可捲動或不可捲動
資料庫游標又分為可捲動性 (scrollable cursor) 游標與不可捲動性游標,可捲動性游標代表資料庫游標可以依據游標的操作指令來移動,像是向前 (NEXT)、向後 (BACK)、朝指定位置移動等等性質。此種游標在執行資料庫複製 (Replication) 時,是一個相當重要的能力,但可捲動性游標又會比不可捲動性游標消耗更多的資源。
缺點
資料庫游標有三個缺點:
- 若在網路應用程式中使用,會造成大量的網路來回 (Round-trip),讓網路流量大增。
- 若在多人應用程式中大量使用游標,會造成大量的鎖定,因此使用不當的話,讓資料庫發生死結的機率會大增。
- 在SQL預存程序或SQL預存函數使用時,如果在巢式迴圈之中使用多個資料庫游標,將使得資料的存取效能嚴重低落。