自訂索引的鎖定
「Microsoft SQL Server Database Engine」的動態鎖定策略在大部份的情況下都會自動為查詢選擇最佳的鎖定資料粒度 (Granularity)。在存取模式容易理解且維持一致的情況下,對索引可用的鎖定層級加以限制較為有利。
例如,資料庫應用程式使用的尋查資料表 (Lookup Table) 以批次處理序每週重新整理一次。最有效的鎖定策略是關閉分頁與資料列鎖定,並允許所有同時發生的讀取者取得資料表的共用 (S) 鎖定,來減輕負擔。在每週批次更新期間,更新的處理序可以採用獨占 (X) 鎖定,然後更新整個資料表。
用於索引的鎖定資料粒度可以使用 CREATE INDEX 和 ALTER INDEX 陳述式來設定。此外,您可以使用 CREATE TABLE 和 ALTER TABLE 陳述式來設定 PRIMARY KEY 和 UNIQUE 條件約束的鎖定資料粒度。基於回溯相容性,sp_indexoption 系統預存程序也可以設定資料粒度。若要顯示針對給定索引目前鎖定的選項,請使用 INDEXPROPERTY 函數。分頁層級鎖定、資料列層級鎖定、或是分頁層級與資料列層級鎖定的組合可不允許特定索引採用。
不允許的鎖定 | 存取索引者 |
---|---|
分頁層級 |
資料列層級與資料表層級鎖定 |
資料列層級 |
分頁層級與資料表層級鎖定 |
分頁層級與資料列層級 |
資料表層級鎖定 |
例如,已知某一資料表為競爭點時,不允許分頁層級鎖定可能較為有利,因為這樣只允許資料列層級鎖定。或者,如果資料表掃描一直都是用來存取索引或資料表,僅允許資料表層級鎖定而不允許分頁層級與資料列層級鎖定則更有助益。
重要事項: |
---|
Database Engine 查詢最佳化工具幾乎永遠都會選擇正確的鎖定資料粒度。建議您不要覆寫最佳化工具所做的決定。不允許鎖定層級可能會嚴重影響資料表或索引的並行。例如,對多數使用者經常存取的大型資料表僅指定資料表層級鎖定,可能嚴重影響效能。使用者必須等到釋放資料表層級鎖定之後才能存取資料表。 |
請參閱
其他資源
ALTER INDEX (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE INDEX (Transact-SQL)
CREATE TABLE (Transact-SQL)
INDEXPROPERTY (Transact-SQL)
sp_indexoption (Transact-SQL)