指標 (資料庫)

資料指標（Data Cursor）或稱游標，是在資料庫引擎 (Database Engine)中，讓開發人員或資料庫管理員可以遍歷、瀏覽檢索結果的資料列(稱為資料查詢結果集, Result set)，是主要用於在結果集中移動到某一資料列(row)的控制結構。游標可以被看作是指向一組列中，代表某一列的指針。游標一次只能引用一列，但可以根據需要移動到結果集的其他列。

游標有助於隨檢索之後的資料處理與遍歷相結合，如添加和刪除記錄。它能遍歷資料查詢結果集的特性，類似於編程語言的迭代器概念。開發程序人員通常依需求而使用游標，來處理由資料庫系統查詢返回的整個結果集。在這種情況下，游標可使結果集中的資料列依照次序處理。在SQL程序中，使用游標可以定義檢索集（多行資料列的條件選取組合）並逐行執行資料處理的邏輯。通過相同的機制，SQL程序也可將結果集直接返回給調用者或客戶端應用程序；也常會被外部的資料存取介面所使用，像是 ADO、JDBC、 ADO.NET、PL-SQL 等都有資料指標的應用。

原理
資料指標是在資料庫產生結果集時，由資料庫引擎所產生的一個指標，用來指示目前正在存取的結果集的位置，經由這個指標，可以得到結果集中的資料列，並且可以依照需求來移動，但由於指標會佔用伺服器的資源，並且在指標開啟期間會啟用共用鎖定(Shared Lock)，在多人使用的系統中容易造成死結的問題，因此目前大部份的應用程式都是使用僅前移型指標 (Forward-Only Cursor)。

種類
依照功能來區分，有四種。

靜態指標
靜態指標 (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預存函數使用時，如果在巢式迴圈之中使用多個資料庫指標，將使得資料的存取效能嚴重低落。

參考資料

資料庫
编程中的迭代