自定义索引的锁定
Microsoft SQL Server 数据库引擎 使用动态锁定策略,这种策略能够在大多数情况下自动为查询选择最佳锁定粒度。在访问模式很好理解且一致的情况下,限制索引可以使用的锁定级别很有用。
例如,某个数据库应用程序使用的查找表在批处理进程中每周刷新一次。最有效的锁定策略是关闭页锁定和行锁定,并允许所有并发读取器获得表上的共享锁(S 锁)以减少开销。在每周批处理更新时,更新进程可以使用排他锁(X 锁),然后更新整个表。
可以使用 CREATE INDEX 和 ALTER INDEX 语句来设置索引使用的锁定粒度。另外,CREATE TABLE 和 ALTER TABLE 语句还可用于设置 PRIMARY KEY 和 UNIQUE 约束的锁定粒度。为了向后兼容,还可以使用 sp_indexoption 系统存储过程设置粒度。若要显示给定索引的当前锁定选项,请使用 INDEXPROPERTY 函数。可以禁止将页级别的锁、行级别的锁或二者的组合用于指定的索引。
禁止的锁 | 访问索引的锁 |
---|---|
页级别 |
行级别的锁和表级别的锁 |
行级别 |
页级别的锁和表级别的锁 |
页级别和行级别 |
表级别的锁 |
例如,当已知表是争用点时,禁止页级别的锁,从而只允许行级别的锁会很有用。或者如果总是使用表扫描来访问索引或表,那么只允许表级别的锁,而禁止页级别的锁和行级别的锁将会很有帮助。
重要提示: |
---|
数据库引擎 查询优化器基本上都能选择正确的锁定粒度。建议您不要覆盖优化器作出的选择。禁止锁定级别反过来会影响表或索引的并发。例如,在由许多用户频繁访问的大型表上只指定表级别的锁会严重影响性能。用户必须等到释放表级别的锁后才能访问表。 |
请参阅
其他资源
ALTER INDEX (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE INDEX (Transact-SQL)
CREATE TABLE (Transact-SQL)
INDEXPROPERTY (Transact-SQL)
sp_indexoption (Transact-SQL)