none
Melhores praticas para persistencia no banco de dados. RRS feed

  • Pergunta

  • Estou com o seguinte cenário:

    Tenho uma aplicacao que captura as informações dos equipamentos (software instalado e os hardwares existentes) e lança no banco de dados, antigamente eu pegava item por item e lancaça através de uma procedure onde nessa procedure ele dava um select para verificar se o registro ja existia, caso existisse ele dava um update caso contrario ele incluia o registro, porem cada maquina me gera na media umas 150 a 200 itens (contando com softwares instalados, memoria, hd, etcs) sem contar que são mais de 1000 equipamentos e geralmente o client roda no mesmo horario (de manha quando o equipamento é ligado), isso estava deixando o servidor SQL Server muito lento, agora estamos remodelando o processo para um melhor aproveitamento e deixar o processo mais limpo no servidor.

    Eu pensei de fazer na seguinte maneira agora, atraves de um aplicativo eu dou um select na tabela que preciso trazendo as informacoes que ja existem no servidor, e faço um loop nas informações capturadas qdo o equipamento é ligado e comparo, se o item ja existe eu gero um update, caso seja novo um insert e um delete caso nao exista mais o item tudo em um campo string para depois enviar um unico bloco para o sql server, voces acreditam que dessa forma seria consumido menos recursos do servidor SQL Server ou alguem tem alguma sugestão...

    quinta-feira, 20 de setembro de 2012 12:30

Respostas

Todas as Respostas

  • Bom dia Savoine !

        Acho boa a sua estratégia de atualizar o que ja existe e incluir o que ainda não existe, mas não acho que seja interessante deletar os registros caso precise de um historico no futuro, não vale a pena criar um campo de status para isto ?


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 20 de setembro de 2012 12:37
  • Cara,

    Precisei fazer um coisa parecida, porém no meu caso eu trouxe o select do banco para um DataTable e mantive ele em memória e sempre que eu precisava comparar, consultar ou alterar alguma coisa eu alterava ele que estava sendo persistido em memória.No final de tudo eu mandava para uma procedure o DataTable inteiro e lá na procedure através de ponteiro eu alterava os dados necessários.

    Dessa minha forma eu vou uma vez para capturar as informações e uma outra para enviar depois de ter feito tudo.

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    quinta-feira, 20 de setembro de 2012 12:41
  • Bom dia Alexandre,

    Nnesse caso eu tenho uma tabela de log, a questao que estou em duvida é a performance, tipo antes era uma SP para cada item que fazia esse procedimento, por exemplo se eu tivesse 4 pentes de memoria ele iria rodar a SP consultando e gerando insert ou update 4 vezes no servidor, agora eu iria fazer um unico select dos itens no meu servidor de aplicacao ele iria fazer um loop comparando as informacoes e geraria um unico texto de comando gerando os updates/deletes/inserts dos items intao eu iria disparar tudo de uma vez, eu gostaria de saber se dessa forma eu economizo recursos no servidor, se no caso seria a melhor opcao.

    quinta-feira, 20 de setembro de 2012 12:45
  • Samuel,

    Intão é o que estou pensando em fazer, o select depois mando um "bloco" com os insert/update/delete de uma vez, nessa caso teoricamente eu faria somente 2 requisições no servidor, um consulta e outra de envio, acredito que estaria utilizando menos recursos do servidor, estou certo ou errado quanto a isso?

    quinta-feira, 20 de setembro de 2012 12:49
  • Com certeza economizaria os recursos do servidor e seria tambem mais rapido fazer um unico bloco de comando do que fazer para cada item separadamente, sempre que possivel é melhor fazer tudo em um unico batch do que fazer cursores ou looping, alem do aproveitamento dos recursos do servidor teria menos trafego de rede.


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 20 de setembro de 2012 12:57
  • Sim, sem dúvidas que quanto menos requisições no servidor melhor.É uma boa estratégia fazer isso.

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    quinta-feira, 20 de setembro de 2012 16:45
  • Típico caso do uso do Merge, que pode contemplar Inser, Update e Delete numa única instrução. talvez tenha que fazer algumas alterações para que seja possível utilizá-lo. Exemplo: precisaria de uma tabela (poderia ser temporária) com os itens a serem inseridos/atualizados/removidos.

    Uma vez que tenha isso, é provável que o Merge seja uma boa saída.

    Observação: Funciona a partir do SQL Server 2008.

    Referências:

    1) Utilizando o comando Merge – Parte 1

    http://www.robersonferreira.com.br/merge_parte1/

    2) Utilizando o comando Merge – Parte 2

    http://www.robersonferreira.com.br/merge_parte2/

    3) Utilizando o comando Merge – Parte 3

    http://www.robersonferreira.com.br/merge_parte3/


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 20 de setembro de 2012 16:55
    Moderador