microsoft - ¿Cuánto encaja insertando en una transacción el rendimiento de la ayuda en el servidor Sql?
sql server descargar (5)
De acuerdo, digamos que tengo 100 filas para insertar y cada fila tiene alrededor de 150 columnas (sé que suena como una gran cantidad de columnas, pero necesito almacenar estos datos en una sola tabla). Las inserciones se realizarán al azar (es decir, cada vez que un grupo de usuarios decida cargar un archivo que contenga los datos), unas 20 veces al mes. Sin embargo, la base de datos estará bajo procesamiento de carga continua de otras funciones de una aplicación empresarial grande. Las columnas son varchar, ints, así como una variedad de otros tipos.
¿La ganancia de rendimiento de envolver estos insertos en una transacción (en lugar de ejecutarlos uno a la vez) va a ser enorme, mínima o en algún punto intermedio?
¿Por qué?
EDITAR: Esto es para Sql Server 2005, pero estaría interesado en 2000/2008 si hay algo diferente que decir. También debo mencionar que entiendo el punto acerca de que las transacciones son principalmente para la coherencia de los datos, pero quiero centrarme en los efectos de rendimiento.
Como han dicho otros, las transacciones no tienen nada que ver con el rendimiento, sino que tienen que ver con la integridad de sus datos.
Dicho esto, preocuparse por el rendimiento de una manera u otra cuando solo se está hablando de insertar 100 filas de datos unas 20 veces al mes (es decir, 2000 registros por mes) es una tontería. La optimización prematura es una pérdida de tiempo; a menos que haya probado repetidamente el impacto en el rendimiento de estos insertos (tan pequeños como son, y como poco frecuentes) y descubrió que son un problema importante, no se preocupe por el rendimiento. Es insignificante comparado con las otras cosas que mencionaste como carga del servidor.
Depende de lo que usted llame enorme, pero ayudará (realmente depende de la cantidad total de insertos que esté haciendo). Obligará a SQL Server a no hacer una confirmación después de cada inserción, que a su vez se suma. Con 100 inserciones, probablemente no notará demasiado un aumento dependiendo de qué tan seguido y qué más está pasando con la base de datos.
Las transacciones no son por rendimiento sino por integridad de datos. Dependiendo de la implementación, no habrá ninguna ganancia / pérdida de rendimiento para solo 100 filas (solo se registrarán de forma adicional, de modo que todas puedan retrotraerse).
Cosas a considerar sobre los problemas de rendimiento:
- Los TA interactuarán con otras consultas
- escribir TAs bloqueará tuplas / páginas / archivos
- commits podría ser la actualización (según el protocolo de bloqueo) de una marca de tiempo
- se pueden escribir más registros para TA (uno debería poder retrotraer los TA, pero el DB ya podría iniciar sesión extensamente, el registro secuencial es barato)
- el grado de aislamiento (sé que uno puede cambiar este nivel en algunos DB, y que casi nadie usa el nivel 3)
En general: use TA para garantizar la integridad.
Puede ser un impacto en realidad. El punto de las transacciones no se trata de cuántos haces, se trata de mantener la actualización de datos constante. Si tiene filas que deben insertarse juntas y son dependientes entre sí, esos son los registros que ajusta en una transacción.
Las transacciones se tratan de mantener la coherencia de sus datos. Esto debería ser lo primero que piense al usar transacciones. Por ejemplo, si tiene un débito (retiro) de su cuenta de cheques, quiere asegurarse de que el crédito (depósito) también esté hecho. Si alguno de ellos no tiene éxito, toda la "transacción" se debe revertir. Por lo tanto, ambas acciones DEBEN envolverse en una transacción.
Al hacer inserciones por lotes, divídalas en 3000 o 5000 registros y recorra el conjunto. 3000-5000 ha sido un rango de números dulce para inserciones; no vaya por encima de eso a menos que haya probado que el servidor puede manejarlo. Además, pondré GOs en el lote en aproximadamente cada 3000 o 5000 registros para inserciones. Actualizaciones y eliminaciones Pondré un GO en alrededor de 1000, porque requieren más recursos para comprometerse.
Si estás haciendo esto desde el código C #, entonces en mi opinión, deberías construir una rutina de importación por lotes en lugar de hacer millones de insertos de uno en uno a través de la codificación.
Si bien las transacciones son un mecanismo para mantener la coherencia de los datos, en realidad tienen un impacto masivo en el rendimiento si se usan incorrectamente o se usan en exceso. Acabo de terminar una publicación de blog sobre el impacto en el rendimiento de especificar explícitamente las transacciones en lugar de permitir que ocurran de forma natural.
Si está insertando varias filas y cada inserción se produce en su propia transacción, hay una gran sobrecarga en el bloqueo y desbloqueo de datos. Al encapsular todas las inserciones en una sola transacción, puede mejorar notablemente el rendimiento.
Por el contrario, si tiene muchas consultas ejecutándose contra su base de datos y también se están produciendo grandes transacciones, pueden bloquearse entre sí y causar problemas de rendimiento.
Las transacciones están vinculadas definitivamente con el rendimiento, independientemente de su intención subyacente.