Tengo un fragmento de código que realiza inserciones en tablas altamente desnormalizadas. Las tablas tienen un número de columnas que van desde ~ 100 hasta 300+. Este es SQL Server 2008 R2, que se ejecuta en Windows Server 2008.
Cada inserción consiste en insertar en varias tablas bajo la misma transacción. NHibernate agrupa algunos insertos, pero otros no, pero todos están bajo la misma transacción.
Cuando realizo inserciones por ejemplo 500 veces llamando repetidamente a un fragmento de código que realiza la inserción, obtengo un promedio de ~ 360 ms.
Lo extraño es que, cuando ejecuto el código de prueba simultáneamente usando 4 procesos (el mismo exe se ejecuta desde 4 mensajes de comando diferentes en Windows Server 2008), el rendimiento de inserción por llamada mejora mucho. Veo ráfagas que van tan rápido como 90 ms (casi X4 más rápido). Estoy midiendo el tiempo de inserción del código.
Dado que los 4 procesos no saben nada el uno del otro, supongo que esto tiene algo que ver con SQL Server, pero no tengo ni idea de por qué. Me gustaría saber por qué sucede esto y si hay alguna configuración que me permita obtener el mismo rendimiento cuando las inserciones no son tan frecuentes.
Las sugerencias con respecto a los métodos de monitoreo de SQL Server para comprender lo que está sucediendo en el nivel de base de datos son igualmente bienvenidas.
fuente
Algunos servidores / cpus / os recuerdan los patrones. como caché
Como estás haciendo lo mismo 4 veces, estoy seguro de que hay formas en que puede cortar esquinas, lo que supongo es que la primera forma en que lo haces, lo considera como un proceso largo (ejemplo1), pero en la segunda forma ve el código reutilizado y lo ejecuta como caché (ejemplo2) o podría ser el primer proceso demasiado grande para que quepa todo en el (ejemplo de ram3).
ejemplo1: 0111110000110111110000111011111000011110111110000
ejemplo2: 0111110000 | 11 | 0111110000 | 111 | 0111110000 | 1111 | 0111110000
ejemplo3: 0111110000011111000001111100000111110000 ejemplo3: bucle: 0111110000
Sé que el servidor ubuntu hace esto con repetidas consultas mysql. Puedo guardarlos en caché, aunque en realidad la única diferencia en el tiempo es de 10-40 mm, pero se suma. Cuando estaba en la escuela había clases que mostraban que tenía que hacer que los programas (perl / php) usaran ese caché para ser más rápidos.
Pero, puede depender del programa, de qué idioma es, en qué está compilado o cómo fue programado.
fuente