我有一个现有表:
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))
);
该表有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
);
我在SSMS中通过按自己执行了该语句F5。它运行了超过一分钟,然后开始阻止其他会话。然后,CREATE INDEX
由于无法阻止其他会话,我立即取消了该命令。
在第一分钟内,没有任何东西阻塞我的CREATE INDEX
命令,当然sys.dm_exec_requests
以等待类型CXPACKET
- 显示了该过程。自从操作并行以来,我认为这不是一件坏事。
我没有很多时间检查的输出sys.dm_exec_requests
。查询仅返回一行WHERE session_id = xxx
。被阻止的会话正在尝试将行插入目标表。
我不知道锁可以持续多久,只是说我在语句开始后2分钟左右取消了该语句的执行。此时大约一分钟发生了阻塞。
我误解了WITH (ONLINE=ON)
吗?还是我需要注意的其他事项?
该服务器是一台功能强大的机器,配备2个四核Xeon E5-2643 3.3Ghz处理器,192GB RAM和能够存储5,000+ iops的SAN存储。CPU通常低于20%,RAM则占93%,主要是由SQL Server使用的。包装盒上没有其他任何东西运行,只有Windows Server 2012和SQL Server 2012。