Tengo una tabla existente:
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))
);
Esta tabla tiene 150,000,000 filas. El sistema está en funcionamiento las 24 horas del día, los 7 días de la semana, los 365 días del año, por lo que no hay ventanas de mantenimiento que ocurran regularmente.
Quiero agregar un índice a la tabla, y con la edición Enterprise de SQL Server, debería poder hacerlo sin bloquear el acceso de escritura a la tabla. El comando que usé fue:
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
);
Ejecuté la declaración sola en SSMS, presionando F5. Funcionó por más de un minuto, luego comenzó a bloquear otras sesiones. Luego cancelé inmediatamente el CREATE INDEX
comando ya que no puedo bloquear otras sesiones.
Durante el primer minuto, nada bloqueaba mi CREATE INDEX
comando, sys.dm_exec_requests
mostró el proceso con un tipo de espera CXPACKET
, por supuesto. No creo que sea algo malo ya que la operación fue paralela.
No tuve mucho tiempo para inspeccionar la salida de sys.dm_exec_requests
. Solo se devolvió una fila de la consulta WHERE session_id = xxx
. Las sesiones bloqueadas intentaban insertar filas en la tabla de destino.
No sé cuánto duraron las cerraduras, excepto para decir que cancelé la ejecución de la declaración alrededor de 2 minutos después de que comenzó. Los bloqueos ocurrieron durante alrededor de un minuto en ese punto.
¿Estoy malinterpretando la implementación de WITH (ONLINE=ON)
? ¿O hay algo más que necesito tener en cuenta?
El servidor es una máquina bastante robusta, con 2 procesadores Xeon E5-2643 de cuatro núcleos de 3.3Ghz, 192GB de RAM y almacenamiento SAN capaz de más de 5,000 iops. La CPU suele estar por debajo del 20%, la RAM se utiliza en un 93%, principalmente por SQL Server. No hay nada más ejecutándose en la caja, solo Windows Server 2012 y SQL Server 2012.
fuente