Pregunta:
Tengo un script con alrededor de 45 mil inserciones de declaraciones selectas. Cuando intento ejecutarlo, aparece un mensaje de error que indica que me he quedado sin memoria. ¿Cómo puedo ejecutar este script?
Contexto:
- Se agregaron algunos campos de datos nuevos para que una aplicación funcione bien con otra aplicación que usa el cliente.
- Obtuve una hoja de cálculo de datos del cliente llena de datos que asignaron elementos de datos actuales a valores para estos nuevos campos.
- Hoja de cálculo convertida para insertar declaraciones.
- Si solo ejecuto algunas de las declaraciones, funciona, pero no todo el script.
- No. No hay errores tipográficos.
Si hay una forma diferente en la que debería cargar estos datos, no dude en castigarme y avisarme.
sql-server
sql-server-2005
etl
spaghetticowboy
fuente
fuente
Respuestas:
El tamaño de lote máximo para SQL Server 2005 es 65.536 * Tamaño de paquete de red (NPS), donde NPS suele ser 4KB. Eso funciona a 256 MB. Eso significaría que sus declaraciones de inserción promediarían 5.8 KB cada una. Eso no parece correcto, pero tal vez hay espacios extraños o algo inusual allí.
Mi primera sugerencia sería poner una declaración "IR" después de cada instrucción INSERT. Esto dividirá su único lote de 45,000 declaraciones INSERT en 45,000 lotes separados. Esto debería ser más fácil de digerir. Tenga cuidado, si uno de esos insertos falla, puede ser difícil encontrar al culpable. Es posible que desee protegerse con una transacción. Puede agregar esas declaraciones rápidamente si su editor tiene una buena búsqueda y reemplazo (que le permitirá buscar y reemplazar caracteres de retorno como \ r \ n) o una función de macro.
La segunda sugerencia es usar un asistente para importar los datos directamente desde Excel. El asistente crea un pequeño paquete SSIS para usted, detrás de escena, y luego lo ejecuta. No tendrá este problema.
fuente
GO
después de cada declaración? Bueno, supongo que si los estás generando usando otro script, está bien. De lo contrario, solo pondría uno después de cada 1000INSERT
s. Con respecto a hacer que la transacción sea atómica y minimizar el tamaño de la transacción, ¿por qué no cargar todas las filas en una tabla temporal o variable de tabla y luego cargarlas de una vez desde allí a la tabla de destino?BULK INSERT
obcp
parecen opciones más apropiadas que 45,000 declaraciones de inserciónSi necesita seguir con las instrucciones de inserción, consideraría algunas opciones:
R: Use transacciones y envuelva lotes de 100 o 500 o 1000 extractos en cada uno para minimizar el impacto en el registro y el lote. p.ej
B: en lugar de declaraciones de inserción individuales, úselas
UNION ALL
para 100 o 500 declaraciones a la vez, p. Ej.He dejado el manejo de errores por brevedad, pero el punto es que nunca trataría de enviar un solo lote de 45,000 declaraciones individuales a SQL Server.
fuente
VARCHAR(800)
columnas en 2008 con un tiempo de compilación de 12.5 minutos en mi instancia de desarrollo de 2008, ya que hace mucho trabajo innecesario comparando valores en lugar de simplemente continuar insertándolos (realiza mucho más rápido cuando se parametriza y no hay valores para mirar). Aunque ha mejorado mucho en 2012, el patrón no lineal todavía existe y debe corregirse en la versión posterior.No estoy seguro de por qué está obteniendo el error de falta de memoria, pero hay un enfoque más fácil.
Si puede exportar los datos de la hoja de cálculo a un formato delimitado (por ejemplo, csv), puede usar el asistente de importación de datos en SSMS para insertar los datos por usted:
fuente
Usando múltiples SqlBulkCopy, cree una tabla temporal. Inserte datos nuevos en la tabla temporal, luego combine los datos en la tabla temporal con la existente. Ejemplo usando el método C # SqlBulkCopy.WriteToServer (DataTable) . Espero eso ayude
fuente
Sí, podríamos hacer eso, intenté con un enfoque BCP (Bulk Copy Program) para evitar un problema de OutOfMemory .
Nota : Probado en SQL Server 2014.
En BCP, primero debemos exportar los datos de la base de datos de origen al archivo bcp (en la carpeta del directorio local) y luego debemos importar ese archivo bcp a la base de datos de destino.
A continuación se detallan los pasos de la tarta:
Nota:
a) Asegúrese de que la tabla vacía esté presente en la base de datos de destino
b) Asegúrese de que la carpeta Temp esté presente en la unidad C
Cree un archivo bat denominado Export_Data.bat con el comando que se muestra a continuación:
pausa
Ejecute ese archivo bat, como resultado de eso se generará un archivo bcp en la carpeta Temp
Luego, cree otro archivo bat llamado Import_Data.bat con el siguiente comando:
Pausa
¡Y aquí vamos!
fuente