SQL Server 2005: Mejora el rendimiento de miles o solicitudes de inserción. logout-login time = 120ms

bulkinsert flat-file import sqlbulkcopy sql-server-2005

Pregunta

¿Alguien puede arrojar algunas luces sobre cómo maneja SQL Server 2005? La solicitud emitida por un cliente con ADO.NET 2.0. A continuación se muestra la salida de acortamiento de SQL Trace. Puedo ver que la agrupación de conexiones está funcionando (creo que solo se está agrupando una conexión). Lo que no me queda claro es por qué tenemos tantas llamadas sp_reset_connection, es decir, una serie de: inicio de sesión de auditoría, SQL: inicio en lote, RPC: inicio y cierre de sesión de auditoría para cada bucle para el siguiente bucle. Puedo ver que hay un cambio constante entre tempdb y la base de datos maestra, lo que me lleva a la conclusión de que perdimos el contexto cuando se crea la próxima conexión extrayéndolo del grupo basado en el argumento ConectionString.

Puedo ver que cada 15 ms puedo obtener 100-200 de inicio de sesión / cierre de sesión por segundo (informado al mismo tiempo por el Analizador). Después de 15 ms, tengo nuevamente una serie de 100-200 de inicio / cierre de sesión por segundo.

Necesito una aclaración sobre cómo esto podría afectar a muchas consultas de inserción complejas en el entorno de producción. Utilizo Enterprise Library 2006, el código se compila con VS 2005 y es una aplicación de consola que analiza un archivo plano con 10 de miles de filas que agrupan filas padre-hijo, se ejecuta en un servidor de aplicaciones y ejecuta 2 procedimientos almacenados en un SQL remoto El servidor 2005 inserta un registro principal, recupera el valor de Identidad y, al usarlo, llama al segundo procedimiento almacenado 1, 2 o varias veces (a veces varios miles) insertando registros secundarios. La tabla secundaria tiene cerca de 10 millones de registros con 5-10 índices, algunos de los cuales cubren no agrupados. Hay un disparador de inserción bastante complejo que copia el registro de detalle insertado en una tabla de archivo. En general, solo tengo 7 inserciones por segundo, lo que significa que puede tomar de 2 a 4 horas para 50 mil registros. Cuando ejecuto Profiler en el servidor de prueba (que es casi equivalente con el servidor de producción) puedo ver que hay aproximadamente 120ms entre las entradas de seguimiento de Audit Logout y Audit Login que casi me dan la oportunidad de insertar aproximadamente 8 registros.

Entonces, mi pregunta es si hay alguna manera de mejorar la inserción de registros, ya que la empresa carga 100 mil registros y realiza una planificación diaria y tiene un SLA para cumplir con la solicitud del cliente como pedidos de archivos planos y algunos archivos grandes> 10 mil tienen que ser procesados ​​( importado rápidamente). 4 horas para importar 60 mil deben reducirse a 30 minutos.

Estaba pensando en usar BatchSize de DataAdapter para enviar múltiples llamadas a procedimientos almacenados, inserciones masivas de SQL para inserciones múltiples de lote desde DataReader o DataTable, carga rápida de SSIS. Pero no sé cómo analizar correctamente el índice de re-indexación y la población de estadísticas y tal vez esto deba tomar algún tiempo para terminar. Lo que es peor es que la compañía utiliza la tabla más grande para informes y otros procesos e índices en línea que no se pueden eliminar. Administro la transacción manualmente estableciendo un campo en un valor y hago una actualización transaccional cambiando ese valor a un nuevo valor que otras aplicaciones están usando para obtener filas comprometidas.

Por favor aconseje cómo abordar este problema. Por ahora, estoy tratando de tener tablas de preparación con un registro mínimo en una base de datos separada y sin índices, e intentaré hacer inserciones de padres primarios (masivos) por lotes. Creo que Production DB tiene un modelo de recuperación simple, pero podría ser una recuperación completa. Si el usuario de la base de datos que está utilizando mi aplicación de consola .NET tiene el rol bulkadmin, significa que sus inserciones masivas se registran mínimamente. Entiendo que cuando una tabla se ha agrupado y muchos índices no agrupados que inserciones todavía se registran para cada fila.

La agrupación de conexiones está funcionando, pero con muchos inicios de sesión / desconexiones. ¿Por qué?

para (int i = 1; i <= 10000; i ++) {utilizando (SqlConnection conn = new SqlConnection ("server = (local); database = master; integrated security = sspi;")) {conn.Open (); using (SqlCommand cmd = conn.CreateCommand ()) {cmd.CommandText = "use tempdb"; cmd.ExecuteNonQuery ();}}}

Seguimiento de SQL Server Profiler:

Audit Login master 2010-01-13 23: 18: 45.337 1 - No agrupado
SQL: BatchStarting usa tempdb master 2010-01-13 23: 18: 45.337
RPC: Iniciando exec sp_reset_conn tempdb 2010-01-13 23: 18: 45.337
Audit Logout tempdb 2010-01-13 23: 18: 45.337 2 - Agrupados
Inicio de sesión de auditoría: maestro de protocolo de red 2010-01-13 23: 18: 45.383 2 - Agrupados
SQL: BatchStarting usa tempdb master 2010-01-13 23: 18: 45.383
RPC: Iniciando exec sp_reset_conn tempdb 2010-01-13 23: 18: 45.383

Audit Logout tempdb 2010-01-13 23: 18: 45.383 2 - Agrupados
Inicio de sesión de auditoría: maestro de protocolo de red 2010-01-13 23: 18: 45.383 2 - Agrupados
SQL: BatchStarting usa tempdb master 2010-01-13 23: 18: 45.383
RPC: Iniciando exec sp_reset_conn tempdb 2010-01-13 23: 18: 45.383
Audit Logout tempdb 2010-01-13 23: 18: 45.383 2 - Agrupados

Respuesta popular

¿Qué quiere decir con "escribir en los archivos de registro". ¿Quiere decir que necesito analizar un archivo plano, hacer transformaciones de campo locales, hacer algunos cálculos basados ​​en filas primarias y de detalles y generar un archivo delimitado en el sistema de archivos o en el formato esperado por el archivo BCP fmt y usar la inserción masiva? Estoy pensando en usar cualquiera de estas técnicas: Acelerar las operaciones de copia con SqlBulkCopy en eggheadcafe.com

Patrón de productor / consumidor http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx

Gracias rad



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué