У мене є існуюча таблиця:
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, тому немає регулярних вікон технічного обслуговування.
Я хочу додати індекс до таблиці, і з виданням Enterprise 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)
? Або є щось інше, що мені потрібно знати?
Сервер є досить приємною машиною, з двома чотириядерними процесорами Xeon E5-2643 3,3 ГГц, пам'яті 192 ГБ оперативної пам’яті та SAN, здатними об'ємом 5000+ іопів. Процесор зазвичай не перевищує 20%, оперативна пам'ять використовується 93%, в основному SQL Server. У коробці більше нічого не працює, лише Windows Server 2012 та SQL Server 2012.