我有一个现有的表:
CREATE TABLE dbo.ProofDetails
(
ProofDetailsID int NOT NULL
CONSTRAINT PK_ProofDetails
PRIMARY KEY CLUSTERED IDENTITY(1,1)
, ProofID int NULL
, IDShownToUser int NULL
, UserViewedDetails bit NOT NULL
CONSTRAINT DF_ProofDetails_UserViewedDetails
DEFAULT ((0))
);
Run Code Online (Sandbox Code Playgroud)
该表有 150,000,000 行。系统 24x7x365 全天候运行,因此没有定期发生的维护窗口。
我想向表中添加索引,并且使用 SQL Server 的企业版,我应该能够在不阻止对表的写访问的情况下做到这一点。我使用的命令是:
CREATE INDEX IX_ProofDetails_ProofID_Etc
ON dbo.ProofDetails (ProofID, IDShownToUser)
INCLUDE (UserViewedDetails)
WITH (ONLINE=ON
, ALLOW_ROW_LOCKS=ON
, ALLOW_PAGE_LOCKS=ON
, FILLFACTOR=100
, MAXDOP=4
);
Run Code Online (Sandbox Code Playgroud)
我在 SSMS 中通过按 自行执行了该语句F5。它运行了超过一分钟,然后开始阻塞其他会话。然后我立即取消了该CREATE INDEX
命令,因为我无法阻止其他会话。
在第一分钟,没有任何东西阻止我的CREATE INDEX
命令,sys.dm_exec_requests
显示了等待类型CXPACKET
- 当然。我认为这不是一件坏事,因为操作是并行化的。 …