为用户定义的聚集索引和非聚集索引或没有聚集索引的表设置锁选项值。
SQL Server 2005 数据库引擎 自动从页级锁、行级锁或表级锁中进行选择。您不必手动设置这些选项。sp_indexoption专门为清楚了解特殊类型锁的适用情况的专家级用户而提供。
, [ @OptionName = ] 'option_name'
, [ @OptionValue = ] 'value'
用户定义的表或索引的限定或非限定名称。table_or_index_name的数据类型为 nvarchar(1035),没有默认值。仅当指定限定索引或表名时,才需要使用引号。如果提供了包含数据库名称的完全限定表名,则数据库名称必须为当前数据库的名称。如果指定表名时未使用索引,则将为该表中的所有索引和表本身设置指定的选项(前提是不存在聚集索引)。
[ @OptionName = ] 'option_name '索引选项名。option_name的数据类型为 varchar(35),没有默认值。option_name可以有下列值之一。
值 说明AllowRowLocks
如果为 TRUE,则访问索引时允许使用行锁。数据库引擎确定何时使用行锁。如果为 FALSE,则不使用行锁。默认值为 TRUE。
AllowPageLocks
如果为 TRUE,则访问索引时允许使用页锁。数据库引擎确定何时使用页锁。如果为 FALSE,则不使用页锁。默认值为 TRUE。
DisAllowRowLocks
如果为 TRUE,则不使用行锁。如果为 FALSE,则访问索引时允许使用行锁。数据库引擎确定何时使用行锁。
DisAllowPageLocks
如果为 TRUE,则不使用页锁。如果为 FALSE,则访问索引时允许使用页锁。数据库引擎确定何时使用页锁。
[ @OptionValue = ] 'value '指定启用(TRUE、ON、yes 或 1)还是禁用(FALSE、OFF、no 或 0)option_name设置。value的数据类型为 varchar(12),没有默认值。
0(成功)或大于 0(失败)
不支持 XML 索引。如果指定 XML 索引,或指定了不包含索引名的表名,且该表包含 XML 索引,则该语句将失败。若要设置这些选项,请改用 ALTER INDEX。
若要显示当前行锁和页锁属性,请使用 INDEXPROPERTY或 sys.indexes目录视图。
如果 AllowRowLocks= TRUE 或 DisAllowRowLocks= FALSE,且 AllowPageLocks= TRUE 或 DisAllowPageLocks= FALSE,则访问索引时允许使用行锁、页锁和表锁。数据库引擎将选择相应的锁,并且可以将锁从行锁或页锁升级到表锁。有关详细信息,请参阅锁升级(数据库引擎)。
如果 AllowRowLocks= FALSE 或 DisAllowRowLocks= TRUE,且 AllowPageLocks= FALSE 或 DisAllowPageLocks= TRUE,则访问索引时只允许使用表锁。
如果指定表名时不包含索引,则设置将应用于该表的所有索引。如果基础表没有聚集索引(即它是一个堆),则设置按如下方式应用:
如果将 AllowRowLocks或 DisAllowRowLocks设置为 TRUE 或 FALSE,则设置应用于堆以及任何关联的非聚集索引。
如果将 AllowPageLocks选项设置为 TRUE,或将 DisAllowRowLocks设置为 FALSE,则设置应用于堆以及任何关联的非聚集索引。
如果将 AllowPageLocks选项设置为 FALSE,或将 DisAllowPageLocks设置为 TRUE,则设置完全应用于非聚集索引。也就是说,对非聚集索引禁用所有页锁。在堆上,只允许对页禁用共享 (S) 锁、更新 (U) 锁和排他 (X) 锁。数据库引擎仍然可以获取意向页锁(IS、IU 或 IX),以供内部使用。
有关对索引配置锁粒度的详细信息,请参阅自定义索引的锁定。
权限需要对表的 ALTER 权限。
以下示例对 Customer表的 IX_Customer_TerritoryID索引禁用页锁。
GO
EXEC sp_indexoption N'Sales.Customer.IX_Customer_TerritoryID',
N'disallowpagelocks', TRUE;
以下示例对与 Product表关联的所有索引禁用行锁。在执行 sp_indexoption过程的前后,需要使用 sys.indexes目录视图来显示语句的结果。
GO
--Display the current row and page lock options for all indexes on the table.
SELECT name, type_desc, allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'Production.Product');
GO
-- Set the disallowrowlocks option on the Product table.
EXEC sp_indexoption N'Production.Product',
N'disallowrowlocks', TRUE;
GO
--Verify the row and page lock options for all indexes on the table.
SELECT name, type_desc, allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'Production.Product');
GO
以下示例对不包含聚集索引的表(堆)禁用页锁。在执行 sp_indexoption过程的前后,需要使用 sys.indexes目录视图来显示语句的结果。
GO
--Display the current row and page lock options of the table.
SELECT OBJECT_NAME (object_id) AS [Table], type_desc, allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = N'DatabaseLog';
GO
-- Set the disallowpagelocks option on the table.
EXEC sp_indexoption DatabaseLog,
N'disallowpagelocks', TRUE;
GO
--Verify the row and page lock settings of the table.
SELECT OBJECT_NAME (object_id) AS [Table], allow_row_locks, allow_page_locks
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = N'DatabaseLog';
GO
配置SQLSERVER 单个表或单个索引只使用行锁
EXEC sp_indexoption N'test.Ref_a_m_s', N'AllowPageLocks', false
EXEC sp_indexoption N'test', N'AllowPageLocks',false
配置SQLSERVER 只使用行锁
ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE--数据库改为单用户模式
ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE dbname SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE dbname SET MULTI_USER--数据库改为多用户模式