为什么 SQL Server 的在线索引会导致阻塞?

Hen*_*Lee 5 sql-server-2008 sql-server blocking

我的理解是在线索引在开始(准备)和结束(最终)阶段获取锁。但是,我们看到很多 DML 查询在构建阶段被阻塞。

被阻止的查询的样本显示它们有一些共同点 - 等待类型是 PAGELATCH_UP,等待资源引用 PFS 页面,并且查询使用锁定提示(NOLOCK、ROWLOCK 等)。锁定提示会干扰吗?

任何人都可以在这里阐明或指出我正确的方向吗?

让我补充一下,实际命令是:

ALTER TABLE dbo.Whatever DROP CONSTRAINT [PK_Whatever] WITH (ONLINE=ON);
Run Code Online (Sandbox Code Playgroud)

这是聚集索引,没有非聚集索引。

Pau*_*ite 4

不管官方文档如何说,删除聚集索引ALTER TABLE DROP CONSTRAINT可以在线执行(在 SQL Server 2005-2014 上测试):

USE Sandpit;

ALTER DATABASE Sandpit
SET RECOVERY SIMPLE;

CREATE TABLE dbo.Test 
(
    col1 integer NOT NULL, 
    CONSTRAINT PK PRIMARY KEY CLUSTERED (col1)
);

INSERT dbo.Test 
VALUES (1);

CHECKPOINT;

BEGIN TRANSACTION;

ALTER TABLE dbo.Test 
DROP CONSTRAINT PK WITH (ONLINE = ON);

SELECT 
    [Current LSN], 
    [Operation], 
    [Transaction Name], 
    [Xact ID], 
    [Description]
FROM sys.fn_dblog(NULL,NULL) AS FD
WHERE
    FD.[Transaction Name] IS NOT NULL;

ROLLBACK TRANSACTION;

DROP TABLE Test;
Run Code Online (Sandbox Code Playgroud)

线上计划

交易日志记录

然而,在线执行操作并不意味着其他并发查询完全不会受到影响。在线操作并不需要长期锁定,但它仍然可能消耗大量的系统资源(例如内存、处理器、I/O)。如果这些资源成为瓶颈,并发查询可能会遇到与资源相关的等待。

在您的特定场景中,页面PAGELATCH_UP等待PFS表明分配资源上存在闩锁争用。任何可能的纠正措施取决于与锁存等待相关的资源描述。