Via Network » Base de Datos

Desde hace un tiempo vengo viendo un problema al hacer múltiples inserts de un servidor a otro con el típico modo podría tardar horas si hablamos de 10 mil o mas inserciones:

insert into MiTabla (campo1,campo2,campo3) value(valor1,valor2,valor3)

Para optimizar una inserción múltiple o masiva TransacSQL tiene una soluciòn interesante (como la tiene mysql, postgres, etc) , esta soluciòn también es empleada por .Net con el metodo bulkcopy, Vamos a evr un ejemplo:

insert into Mitabla (campo1,campo2,campo3)
select valor1,valor2,valor3
union all
select valor1,valor2,valor3
union all
select valor1,valor2,valor3
union all
select valor1,valor2,valor3

como se puede ver la magia esta en seleccionar los campos con un Select y agregar la clausula UNION ALL de tal manera que podríamos agregar la cantidad de registros que necesitemos
Para contarles un poco, probe este script desde PHP para insertar 10 mil registros en 30 segundos un tiempo aceptable si lo comparamos con inserción tradicional, espero sea de utilidad.



Hace unas semana me vi con un problema en una BD de Sql Server y es que en ciertas tablas estaban dañadas que me imagino fue por un apagado brusco del equipo, buen tenia que solucionar el problema sin perder información y tras dar algunas vueltas por Internet pude armar un pequeño script que fue de mucha ayuda y quería compartirlo espero les sea de mucha utilidad.

Use master
go
exec sp_dboption ‘MiBD’, single, true
Use MiBD
go
DBCC CHECKTABLE (MiTabla,REPAIR_ALLOW_DATA_LOSS )
Use master
go
exec sp_dboption ‘MiBD’, single, false



Hace poco me encontre con un problema con una de mi base de datos y es que de pronto la maquina se quedo sin espacio en el disco duro supuse que era la base de datos pero no fue asi y al final me di con problema eras los log que estaban arriba de los 50GB brutal; asi que abri el analizador de consultas y ejecute el siguiente script , ojala les sea util.

use Mibasededatos
checkpoint
checkpoint
checkpoint
backup log Mibasededatos with truncate_only
dbcc shrinkfile (Mibasededatos_log,1)



MySQL soporta distintos tipos de tablas, entre los cuales destacan MyISAM  e InnoDB. El primer tipo es el utilizado por defecto, aunque podemos cambiarlo cuando queramos. 

Las principales ventajas de InnoDB sobre MyISAM son el soporte de transacciones, restricciones foráneas y bloqueo a nivel de fila. Nos permite pues tener las características ACID, garantizando la integridad de nuestras tablas y por tanto simplificando las recuperaciones ante posibles caídas del sistema.Además, al permitir bloqueo a nivel de registro en lugar del bloqueo de tablas que implementa MyISAM, aumenta el rendimiento si nuestra aplicación hace un uso intensivo de sentencias INSERT o UPDATE. Por contra, las ventajas de MyISAM pasan por una mayor velocidad a la hora de recuperar datos, es decir, mayor rendimiento ante mayoría de sentencias SELECT- y por permitir crear índices sobre campos de tipo text. Este mayor rendimiento se produce gracias al no comprobar la integridad referencial ni bloquear las tablas a la hora de realizar las operaciones -aunque con ello se prescinda de la atomicidad-. Para aplicaciones web -que suelen tener más consultas que operaciones de escritura- puede ser más que suficiente. La elección pasa, como siempre, por conseguir la mejor relación calidad / precio. Si necesitamos transacciones, claves foráneas, bloqueo a nivel de fila o cualquier característica ACID, lo mejor será InnoDB. Si por el contrario no necesitamos nada de esto, o nuestra base de datos va a ser utilizada mayoritariamente para consulta, optaríamos por MyISAM.