J'ai une table existante:
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))
);
Ce tableau comporte 150 000 000 lignes. Le système fonctionne 24x7x365, il n'y a donc pas de fenêtres de maintenance régulières.
Je veux ajouter un index à la table, et avec l'édition Enterprise de SQL Server, je devrais pouvoir le faire sans bloquer l'accès en écriture à la table. La commande que j'ai utilisée était:
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
);
J'ai exécuté l'instruction seule dans SSMS, en appuyant sur F5. Il a fonctionné pendant plus d'une minute, puis a commencé à bloquer d'autres sessions. J'ai ensuite immédiatement annulé la CREATE INDEX
commande car je ne peux pas bloquer d'autres sessions.
Pendant la première minute, rien ne bloquait ma CREATE INDEX
commande, a sys.dm_exec_requests
montré le processus avec un type d'attente de CXPACKET
- bien sûr. Je ne pense pas que ce soit une mauvaise chose puisque l'opération a été parallélisée.
Je n'ai pas eu beaucoup de temps pour inspecter la sortie de sys.dm_exec_requests
. Une seule ligne a été renvoyée par la requête WHERE session_id = xxx
. Les sessions bloquées tentaient d'insérer des lignes dans la table cible.
Je ne sais pas combien de temps les verrous ont duré, sauf pour dire que j'ai annulé l'exécution de la déclaration environ 2 minutes après son début. Des blocages se sont produits pendant environ une minute à ce moment-là.
Suis-je mal à comprendre la mise en œuvre de WITH (ONLINE=ON)
? Ou y a-t-il autre chose dont je dois être conscient?
Le serveur est une machine assez robuste, avec 2 processeurs Xeon E5-2643 3,3 GHz à quatre cœurs, 192 Go de RAM et un stockage SAN capable de plus de 5000 iops. Le processeur est généralement inférieur à 20%, la RAM est utilisée à 93%, principalement par SQL Server. Il n'y a rien d'autre en cours d'exécution sur la boîte, juste Windows Server 2012 et SQL Server 2012.