用于在 SQL Server 中的聚集索引上生成页锁的示例查询/DDL(无提示)

Mar*_*uth 4 sql-server-2008 sql-server locking

我们目前有一些ALLOW_PAGELOCKS设置为关闭的索引。这样做大概是为了减少死锁。但是,我怀疑当时它真的会产生影响。

现在我试图了解 SQL Server 何时实际选择开始锁定页面而不是聚集索引中的键。我最近问过 Jonathan Keyhaisas,他告诉我如果我在多个后续页面上触摸行,就会发生这种情况。但是,我没有通过使用示例查询更新聚集索引中的行来获得任何独占页面锁。

你能通过示例查询和表帮助我更好地理解页锁吗?我正在运行 SQL Server 2008 SP4。

提前致谢

马丁

Eri*_*ing 6

我们可以使用大约相同大小的表,但我们需要一些更有趣的数据。具体来说,SQL 没有索引但我们在修改谓词中使用的数据。

USE tempdb;

CREATE TABLE dbo.Dummy
(
  Id INT IDENTITY(1, 1),
  Crap DATE,
  MoreCrap VARCHAR(1000)
);

INSERT dbo.Dummy ( Crap, MoreCrap )
    SELECT TOP 1000000 DATEADD(DAY, x.Rn % 365 + 1, GETDATE()), CONVERT(VARCHAR(100), NEWID())
        FROM ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Rn
        FROM sys.messages AS m
        CROSS JOIN sys.messages AS m2 
        ) AS x ( Rn );

CREATE CLUSTERED INDEX cx_RemusForPresident ON dbo.Dummy (Id) 
Run Code Online (Sandbox Code Playgroud)

仅在 Id 列上显示 CX,我们就进行更新!

BEGIN TRAN
UPDATE d
SET d.MoreCrap = 'Happy Friday'
FROM dbo.Dummy AS d
WHERE d.Crap >= '20170601'
AND d.Crap < '20170630'
AND d.MoreCrap LIKE '0%'
Run Code Online (Sandbox Code Playgroud)

就像以前一样,虽然希望不会冒犯 Aaron Bertrand,但我们检查了sp_WhoIsActive

EXEC sp_WhoIsActive @get_locks = 1

和布拉莫!Pages 上的排他锁和对象上的 IX 锁,没有键锁。

坚果

坚果

坚果