Social Icons

twitter facebook google plus linkedin

jueves, 6 de septiembre de 2012

Duplicar datos tabla en la misma tabla (Y como comerse la memoria y el disco de forma brutal)

Hoy estaba jugando con mi SQL Server, obviamente en entorno de pruebas,  y tuve la "brillante" idea de duplicar los datos de una tablas de hecho de AdventureWorksDW. Aparte de lograr que los registros se duplicaran, noté bastantes cosas que quiero compartir con ustedes.

Importante: Antes de duplicar los datos dentro de la misma tabla, debes desactivar las claves primarias. De lo contrario, arrojará un error. Recomiendo copiar los datos hacia una tabla temporal.

Sentencias:

INSERT INTO tabla SELECT * FROM tabla
Esta es la sentencia básica. Lo que hace es seleccionar todos los registros y volverlos a insertar. O sea, si se tienen 10 registros, insertará esos mismos 10 registros, quedando así con 20 registros. Ésta es la forma mas básica que hay.

INSERT INTO tabla SELECT top 100 * FROM tabla
Esta selecciona los 100 primeros registros y las inserta. O sea, si se tienen 1000 registros, insertará los primeros 100 registros, quedando así con 1100 registros.

INSERT INTO tabla SELECT * FROM tabla WHERE campo1 = 'algo'
Esta sentencia selecciona e inserta solo los registros donde la clausula WHERE se cumpla. No importa cuantos registros sean.

INSERT INTO tabla SELECT top 100 * FROM tabla WHERE campo1 = 'algo'
Esta hace lo mismo que la anterior, pero solo tomando en cuenta los 100 primeros registros.

Nunca hagas esto (a no ser de que sepas muy bien lo que estás haciendo)

Puedes hacer un sencillito script que duplique de forma exponencial los registros, causando un excesivo uso de disco y recursos de memoria. Con esta operación, el log de transacciones crece de forma desmesurada.


DECLARE @contador int
SET @contador = 0
WHILE (@contador < 10)
BEGIN
INSERT INTO tabla SELECT * FROM tabla
SET @contador = @contador + 1
END
GO

Si tenemos una tabla de 1000 registros, la primera vez insertará 1000 registros, quedando así con 2000 registros. La segunda vez, seleccionará los 2000 registros y los insertará, quedando así con 4000 registros. Esto ocurrirá hasta que se cumpla la condición (Imagina este escenario, pero  partiendo con 60000 registros)

Para finalizar quiero exponer algunas conclusiones:

  1. Nunca realices experimentos así en entornos de producción.

  2. Siempre ten un respaldo de las bases de datos.

  3. Ten controlado el crecimiento del log de transacciones. Hay mucha documentación al respecto.

  4. Si vas a duplicar los datos de tu tabla, hazlo de manera controlada y no de forma brutal (como lo hice yo)


Chau!