Tôi có một bảng hiện có:
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))
);
Bảng này có 150.000.000 hàng. Hệ thống đang hoạt động 24x7x365, do đó không có cửa sổ bảo trì thường xuyên xảy ra.
Tôi muốn thêm một chỉ mục vào bảng và với phiên bản Enterprise của SQL Server, tôi sẽ có thể làm điều đó mà không chặn truy cập ghi vào bảng. Lệnh tôi đã sử dụng là:
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
);
Tôi đã tự thực hiện câu lệnh trong SSMS, bằng cách nhấn F5. Nó chạy trong hơn một phút, sau đó bắt đầu chặn các phiên khác. Sau đó tôi lập tức hủy CREATE INDEX
lệnh vì tôi không thể chặn các phiên khác.
Trong phút đầu tiên, không có gì chặn CREATE INDEX
lệnh của tôi , sys.dm_exec_requests
cho thấy quá trình với kiểu chờ CXPACKET
- dĩ nhiên. Tôi không nghĩ rằng đó là một điều xấu kể từ khi hoạt động được song song.
Tôi đã không có nhiều thời gian để kiểm tra đầu ra sys.dm_exec_requests
. Chỉ có một hàng duy nhất được trả về từ truy vấn WHERE session_id = xxx
. Các phiên bị chặn đã cố gắng chèn các hàng vào bảng đích.
Tôi không biết các khóa đã kéo dài bao lâu, ngoại trừ việc tôi đã hủy việc thực hiện tuyên bố khoảng 2 phút sau khi bắt đầu. Các khối đã xảy ra trong khoảng một phút tại thời điểm đó.
Tôi có hiểu lầm về việc thực hiện WITH (ONLINE=ON)
? Hoặc có điều gì khác tôi cần phải nhận thức?
Máy chủ này là một cỗ máy khá mạnh mẽ, với 2 bộ xử lý bốn nhân Xeon E5-2643 3.3Ghz, RAM 192GB và bộ lưu trữ SAN có khả năng hơn 5.000 iops. CPU thường dưới 20%, RAM được sử dụng 93%, chủ yếu là SQL Server. Không có gì khác chạy trên hộp, chỉ có Windows Server 2012 và SQL Server 2012.