Tại sao TẠO INDEX VỚI VỚI TRỰC TUYẾN = BẬT truy cập vào bảng trong một vài phút?


22

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 INDEXlệ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 INDEXlệnh của tôi , sys.dm_exec_requestscho 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.

Câu trả lời:


23

Khi tạo một chỉ mục với online = on, quá trình tạo chỉ mục sẽ không chặn khi tự tạo đối tượng chỉ mục, nhưng khi đến gần cuối quá trình, nó sẽ có được khóa sửa đổi lược đồ * trong một khoảng thời gian để thực sự thêm chỉ mục vào bảng, loại khóa này sẽ chặn tất cả các hoạt động bên ngoài cho đến khi khóa được giải phóng, điều này có thể giải thích cho các vấn đề chặn của bạn.

* Sch-MKhông yêu cầu khóa để xây dựng trực tuyến một chỉ mục không bao gồm mới, mặc dù nó được yêu cầu trong tất cả các trường hợp khác. Một chỉ mục không bao gồm mới chỉ yêu cầu khóa chia sẻ mức bảng trong giai đoạn cuối, giống như cần thiết trong giai đoạn chuẩn bị.

Xem Sách trắng này để biết chi tiết:

Hoạt động lập chỉ mục trực tuyến trong SQL Server 2005

Theo đề xuất của Mushtaq Mohammed trong một bình luận về câu hỏi, cũng xem:

Kỳ lân, cầu vồng và hoạt động chỉ số trực tuyến của Paul Randal

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.