Eu tenho uma lista de IDs Foo. Preciso chamar um procedimento armazenado para cada ID.
por exemplo.
Guid[] siteIds = ...; // typically contains 100 to 300 elements
foreach (var id in siteIds)
{
db.MySproc(id); // Executes some stored procedure.
}
Cada chamada é bastante independente das outras linhas, isso não deve ser contencioso no banco de dados.
Minha pergunta: seria benéfico paralelizar isso usando Parallel.ForEach? Ou a IO do banco de dados será um gargalo e mais threads resultariam em mais contenção?
Eu mesmo mediria, no entanto, é difícil medir isso no meu ambiente de teste, onde os dados e a carga são muito menores que o nosso servidor Web real.
Respostas:
2 para resposta № 1Por curiosidade, por que você deseja otimizá-lo com Paralelo.ParaCada e gerar threads / abrir conexões / transmitir dados / obter resposta para todo item em vez de escrever um "sproc" simples que funcione com uma lista de IDs em vez de um único ID?
Desde o primeiro olhar, você deve obter melhorias muito mais visíveis.
1 para resposta № 2
Eu acho que o Parallel.ForEach funcionaria, supondo que seu servidor de banco de dados possa lidar com ~ 150-300 operações simultâneas.
A única maneira de saber com certeza é medir os dois.