指標 (資料庫)
資料指標(Data Cursor)或稱游標,是在資料庫引擎 (Database Engine)中,讓開發人員或資料庫管理員可以遍歷、瀏覽檢索結果的資料列(稱為資料查詢結果集, Result set),是主要用於在結果集中移動到某一資料列(row)的控制結構。游標可以被看作是指向一組列中,代表某一列的指針。游標一次只能參照一列,但可以根據需要移動到結果集的其他列。
游標有助於隨檢索之後的資料處理與遍歷相結合,如添加和刪除記錄。它能遍歷資料查詢結果集的特性,類似於程式語言的迭代器概念。開發程式人員通常依需求而使用游標,來處理由資料庫系統查詢返回的整個結果集。在這種情況下,游標可使結果集中的資料列依照次序處理。在SQL程式中,使用游標可以定義檢索集(多列資料列的條件選取組合)並逐列執列資料處理的邏輯。通過相同的機制,SQL程式也可將結果集直接返回給調用者或客戶端應用程式;也常會被外部的資料存取介面所使用,像是 ADO、JDBC、 ADO.NET、PL-SQL 等都有資料指標的應用。
原理
編輯資料指標是在資料庫產生結果集時,由資料庫引擎所產生的一個指標,用來指示目前正在存取的結果集的位置,經由這個指標,可以得到結果集中的資料列,並且可以依照需求來移動,但由於指標會佔用伺服器的資源,並且在指標開啟期間會啟用共享鎖定(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預存函式使用時,如果在巢式迴圈之中使用多個資料庫指標,將使得資料的存取效能嚴重低落。