自訂索引的鎖定
SQL Server Database Engine 的動態鎖定策略在大部分的情況下都會自動為查詢選擇最佳的鎖定資料粒度。除非資料表或索引存取模式都容易理解且維持一致,而且存在待解決的資源爭用問題,否則我們建議您不要覆寫預設鎖定層級 (開啟頁面和資料列鎖定)。覆寫鎖定層級可能會嚴重妨礙資料表或索引的並行存取。例如,針對使用者經常存取的大型資料表指定僅限資料表層級鎖定可能會導致效能瓶頸,因為使用者必須等候資料表層級鎖定釋放,才能存取資料表。
如果存取模式容易理解且維持一致,在少數情況下,不允許頁面或資料列鎖定可能會很有用。例如,資料庫應用程式使用的查閱資料表以批次處理序每週更新一次。並行讀取器會存取具有共用 (S) 鎖定的資料表,而且每週批次更新會存取具有獨佔 (X) 鎖定的資料表。針對資料表關閉頁面和資料列鎖定會允許讀取器透過共用資料表鎖定以並行方式存取資料表,藉以減少整週的鎖定負擔。當批次作業執行時,它就可以有效率地完成更新,因為它會取得獨佔資料表鎖定。
關閉頁面和資料列鎖定不一定是可接受的作法,因為每週批次更新將會封鎖並行讀取器,使其無法在更新執行時存取資料表。如果批次作業只變更少數資料列或頁面,您就可以變更鎖定層級來允許資料列或頁面層級鎖定,進而讓其他工作階段讀取資料表而不封鎖。如果批次作業具有大量更新,取得資料表的獨佔鎖定可能是確保批次作業有效完成的最佳方式。
有時候,當兩個並行作業取得同一份資料表的資料列鎖定,然後封鎖時,就會發生死結,因為它們都需要鎖定頁面。不允許資料列鎖定會強制其中一項作業等候,避免發生死結。
用於索引的鎖定資料粒度可以使用 CREATE INDEX 和 ALTER INDEX 陳述式來設定。這個鎖定設定會同時套用至索引頁面和資料表頁面。此外,您可以使用 CREATE TABLE 和 ALTER TABLE 陳述式來設定 PRIMARY KEY 和 UNIQUE 條件約束的鎖定資料粒度。基於回溯相容性,sp_indexoption 系統預存程序也可以設定資料粒度。若要顯示針對給定索引目前鎖定的選項,請使用 INDEXPROPERTY 函數。分頁層級鎖定、資料列層級鎖定、或是分頁層級與資料列層級鎖定的組合可不允許特定索引採用。
不允許的鎖定 |
存取索引者 |
---|---|
分頁層級 |
資料列層級與資料表層級鎖定 |
資料列層級 |
分頁層級與資料表層級鎖定 |
分頁層級與資料列層級 |
資料表層級鎖定 |