Pergunta

Eu tenho uma grande conversão de trabalho- 299Gb de imagens JPEG, já no banco de dados, em miniatura equivalentes para relatórios e fins de largura de banda.

Eu escrevi uma função SQLCLR segmento seguro para fazer o negócio de re-amostragem das imagens, lindo trabalho.

O problema é que, quando eu executá-lo em uma declaração UPDATE (do campo PhotoData ao campo ThumbData), este executa linearmente para evitar condições de corrida, usando apenas um processador para resample as imagens.

Por isso, como eu melhor utilizar os 12 núcleos e configuração RAID legal esta máquina banco de dados tem? É para usar uma subconsulta na cláusula FROM da instrução de atualização? Isso é tudo o que é necessário para permitir o paralelismo sobre este tipo de operação?

De qualquer forma a operação está dividida em lotes, cerca de 4000 imagens por lote (em uma consulta de janela de cerca de 391k imagens), esta máquina tem abundância de recursos para queimar.

Foi útil?

Solução

Eu também recomendo a metodologia "round-robin", defendida por kragen2uk e onupdatecascade (estou votando-up). Eu sei que eu tenho algo leitura irritante sobre rotinas CLR e paralelismo SQL, mas eu esquecer o que era apenas agora ... mas eu acho que eles não joguem bem juntos.

O pouco que eu fiz no passado em tarefas semelhantes lo para configurar uma tabela listando cada lote de trabalho a ser feito. Para cada conexão que você fogo até, ele vai para esta tabela, gest o próximo lote, marca como sendo processada, processos de TI, atualizações la como concluída, e repete. Isso permite que você desempenho calibre, gerenciar escala, permitir que pára e reinicia sem ter que começar de novo, e dá-lhe algo para mostrar como completar a tarefa é (muito menos mostrar que é realmente fazendo alguma coisa).

Outras dicas

Por favor, verifique a configuração para o máximo grau de paralelismo (MAXDOP) em seu SQL Server. Você também pode definir o valor MAXDOP.

Este link pode ser útil para você http://www.mssqltips.com/ tip.asp? tip = 1047

aplausos

Você não poderia dividir a consulta em lotes, e executar cada lote separadamente em uma conexão separada? servidor SQL só usa paralelismo em uma consulta quando ele se sente como ele, e embora você pode pará-lo, ou até mesmo incentivá-lo (um pouco), alterando o limite de custo para opção de paralelismo para O, mas eu acho que é bater muito e perder.

Uma coisa isso é digno de nota é que ela só vai decidir se quer ou não usar o paralelismo no momento em que a consulta é compilada. Além disso, se a consulta é compilada num momento em que a carga da CPU é maior, servidor SQL é menos propensos a considerar paralelismo.

Encontrar alguns critérios para quebrar o conjunto em sub-conjuntos distintos de linhas (1-100, 101-200, qualquer que seja) e, em seguida, chamar a sua instrução de atualização a partir de múltiplas conexões ao mesmo tempo, onde cada conexão alças um subconjunto de linhas na mesa. Todas as ligações devem correr em paralelo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top