Eu tenho um pedaço de código que executa inserções em tabelas altamente desnormalizadas. As tabelas têm um número de colunas variando de ~ 100 a 300+. Este é o SQL Server 2008 R2, em execução no Windows Server 2008.
Cada inserção consiste em inserir em várias tabelas sob a mesma transação. Algumas inserções são agrupadas em lotes pelo NHibernate, mas outras não, mas estão todas na mesma transação.
Quando executo inserções, digamos 500 vezes, chamando repetidamente um pedaço de código que executa a inserção, recebo uma média de ~ 360 ms.
O estranho é que, quando executo o código de teste simultaneamente usando 4 processos (o mesmo exe é executado a partir de 4 prompts de comando diferentes no windows server 2008), o desempenho da inserção por chamada fica muito melhor. Vejo rajadas que chegam a 90 ms (quase X4 mais rápido). Estou medindo o tempo de inserção do código.
Como os quatro processos não sabem nada um do outro, suponho que isso tenha algo a ver com o SQL Server, mas não faço a menor idéia do porquê. Gostaria de saber por que isso está acontecendo e se há alguma configuração que me permita obter o mesmo desempenho quando as inserções não são tão frequentes.
Sugestões sobre os métodos de monitoramento do SQL Server para entender o que está acontecendo no nível do banco de dados são igualmente bem-vindas.