¿Una forma indolora de crear un índice agrupado en una tabla enorme?

22

Por lo tanto, tenemos un sitio para clientes que se queja de un rendimiento muy lento. Eché un vistazo y es obvio que el problema se debe a que Somebody Else (grrrr) diseñó una tabla con más de 20 millones de registros sin un índice agrupado.

Ahora quiero crear un índice agrupado en esa tabla, pero en mi entorno de prueba, mi create indexcomando se ha estado ejecutando durante una hora y aún no se ha hecho. El sitio del cliente es un taller que funciona las 24 horas, los 7 días de la semana, y no puede permitirse una hora de inactividad mientras creo un índice.

¿Existe algún método menos de fuerza bruta para crear el índice que termine el trabajo rápidamente o lo haga de una manera inteligente que no mata totalmente el rendimiento del servidor mientras está ocupado?

Estamos utilizando SQL Server Enterprise Edition.

Shaul dice que apoyo a Monica
fuente

Respuestas:

26
  • Si su servidor SQL es Enterprise + Edition y la tabla no tiene ningún campo BLOB, CREATE CLUSTERED INDEX ... WITH(ONLINE=ON)

  • Si no es así, no hay otra forma que no sea crear la tabla con el mismo esquema de lado y transferir sabiamente los datos, incluidas todas las operaciones INSERT / UPDATE / DELETE (usando el disparador, por ejemplo), y luego descartar con precisión la tabla anterior y cambiarle el nombre nuevo con el mismo nombre que el anterior: los inconvenientes son: lento, agrega carga adicional al servidor y al almacenamiento

Oleg Dok
fuente
12

No estoy seguro de qué versión de SQL Server está utilizando su cliente. En la empresa, puede crear el índice con (ONLINE = ON), de modo que la tabla esté disponible hasta que se cree el índice.


fuente
8
  • Cree una nueva tabla idéntica a la original (obviamente necesitará un nombre diferente)
  • Crear índice agrupado en una nueva tabla
  • Cargar datos en una nueva tabla
  • Suelta la mesa original
  • Cambiar el nombre de la nueva tabla con el nombre original

Asegúrese de aplicar los permisos que se requieren del original.

Bryan
fuente