Чому CREATE INDEX… З ONLINE = ON блокує доступ до таблиці протягом декількох хвилин?


22

У мене є існуюча таблиця:

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.

Відповіді:


23

Під час створення індексу з on-line = on процес створення індексу не блокується при створенні самого об'єкта індексу, але коли він доходить до кінця процесу, він придбає блокування модифікації схеми * на період, щоб фактично додайте в таблицю індекс, цей тип блокування заблокує всі зовнішні операції, поки блокування не буде звільнено, що може спричинити ваші проблеми з блокуванням.

* Sch-MБлокування не потрібно для онлайн-складання нового некластеризованого індексу, хоча він необхідний у всіх інших випадках. Новий некластеризований індекс вимагає лише загального блокування на рівні таблиці на останньому етапі, такого ж, як це було потрібно під час підготовчої фази.

Детальну інформацію див. У цій Білій книзі:

Операції індексації в Інтернеті в SQL Server 2005

Як запропонував Муштак Мухаммед у коментарі до питання, також дивіться:

Єдинороги, веселки та операції з індексом в Інтернеті Пола Рандала

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.