¿Cuál es la mejor manera de agregar columnas a tablas de producción grandes en SQL Server 2008 R2? Según los libros en línea de Microsoft:
Los cambios especificados en ALTER TABLE se implementan de inmediato. Si los cambios requieren modificaciones de las filas de la tabla, ALTER TABLE actualiza las filas. ALTER TABLE adquiere un bloqueo de modificación de esquema en la tabla para asegurarse de que ninguna otra conexión haga referencia incluso a los metadatos de la tabla durante el cambio, excepto las operaciones de índice en línea que requieren un bloqueo SCH-M muy corto al final.
(http://msdn.microsoft.com/en-us/library/ms190273.aspx)
En una mesa grande con millones de filas, esto puede llevar un tiempo. ¿Es la interrupción la única opción? ¿Cuál es la mejor manera de manejar este tipo de situación?
Respuestas:
"Depende"
Si agrega una columna que no requiere agregar datos a las filas, entonces puede ser bastante rápido.
Por ejemplo, agregar un int o char requiere movimientos físicos de fila. Agregar un varchar anulable sin valor predeterminado no debería (a menos que el mapa de bits NULL necesite expandirse)
Debe probarlo en una copia restaurada de la producción para obtener una estimación.
La creación de una nueva tabla, la copia y el cambio de nombre pueden llevar más tiempo si tiene que volver a agregar índices y claves en una tabla de mil millones de filas.
He cambiado miles de millones de tablas de filas que tomaron unos segundos para agregar una columna anulable.
¿Dije que primero hiciera una copia de seguridad?
fuente
Si la columna es NULLable, el impacto debe ser insignificante. Si la columna no puede ser NULL y el valor debe establecerse, entonces puede ser bastante diferente. Lo que haría en este caso es, en lugar de agregar una restricción no nula y predeterminada en una sola toma, agregando efectivamente datos a cada fila:
De acuerdo con @gbn en que puede probar esto restaurando una copia de producción y probándola allí ... obtendrá una buena idea del tiempo (suponiendo que el hardware sea algo similar) y también puede ver el impacto en el registro de transacciones.
fuente
•add the not null/default constraints
no estoy seguro de que no haya un problema potencial con esto ... Cuando MSSQL (incluso 2008R2) cambia una columna no nula a nula, si pones un rastro puedes verlo realmente debajo de las cubiertas haciendo una actualización completa de cada fila de la tabla, es decirupdate table1 set column1 = column1
, supongo que está haciendo la verificación no nula de una manera completamente idiota. Esta transacción es el doble del tamaño de la tabla (páginas anteriores y posteriores), por lo que para una tabla DW puede ser enorme. Anteriormente hemos tenido que bcp datos, truncar, hacer cambios nulos a no nulos, luego bcp.Ha considerado:
La desventaja aquí es que debe tener suficiente espacio en la base de datos para realizar este cambio. Es posible que aún necesite un bloqueo de lectura en la tabla para evitar lecturas sucias.
Sin embargo, minimiza el impacto para los usuarios finales si existe la posibilidad o la necesidad de acceder simultáneamente a la tabla original. También debe minimizar la duración de la cerradura.
fuente