Atualmente, temos um processo que precisa processar centenas de milhares de linhas por hora. Por motivos válidos, ele precisa chamar um procedimento armazenado para cada linha. Estamos usando um pacote SSIS (SQL Server 2008) para executar isso em paralelo. Se houver 400k linhas para fazer, dividimos isso por 10 e, em seguida, dizemos a cada tarefa SQL dentro do contêiner (temos 10 tarefas, para que cada uma basicamente monopolize uma CPU) para fazer as linhas 1-40000, 40001-80000, etc. , nem todas as linhas são iguais, portanto, frequentemente temos 8 dos 10 SPIDs ociosos, aguardando a conclusão dos últimos 2, para que o trabalho possa ser iniciado novamente e processar as linhas recebidas desde o início do processamento.
Tem que haver uma maneira melhor de fazer isso. Ainda não posso mover isso para o SSIS 2012/14, e é vinculado à CPU, então não posso executar o pacote SSIS em uma caixa diferente (além disso, a sobrecarga provavelmente seria um pesadelo). Suponha também que não estou fazendo isso no Service Broker.
Uma ideia que tivemos foi salvar cada bloco de 1.000 como uma linha em uma tabela e, em seguida, executar vários trabalhos. Cada um processaria um bloco de 1.000 e reivindicaria uma nova linha (e, portanto, as próximas 1.000) ao terminar. Também não há necessidade de SSIS. Mas não tenho certeza de como o custo indireto / de desenvolvimento de fazer isso se compara a uma simples alteração de design no SSIS.
Desde já, obrigado!
Supondo que eu entenda a situação, você tem muitos dados de origem para processar, mas todos precisam passar por um destino lento (procedimento armazenado), então há um componente nativo, Balanced Data Distributor , que pode ser interessante.
À medida que uma linha flui para um BDD, ele pode detectar se os consumidores de dados downstream estão ocupados (se há contrapressão). É um pouco semelhante a um Multicast, pois você pode ter vários caminhos de saída, mas não terá dados duplicados fluindo para eles. Em vez disso, usará a detecção de contrapressão para saber se um trabalhador está disponível. Isso deve resolver o problema que você está encontrando com a segmentação manual do problema.
Ele não vem pré-instalado com o SSIS, então você precisa trabalhar com isso, mas é um componente suportado pelo MS.