locked
Executando SPs de um servidor de aplicações RRS feed

  • Pergunta

  • Senhores,

    Eu sempre trabalhei com Oracle, e recentemente a empresa em que trabalho resolveu migrar seu sistema para funcionar também no SQL Server.

    Nós tinhamos algumas Stored Procedures em PL/SQL que tiveram que ser migradas para T-SQL.

    A nossa aplicação é feita em Java, e o nosso servidor de aplicações realiza a chamada das SPs quando necessário, no entando eu notei uma diferença na chamada das SPs do Oracle e do SQL Server.

    Quando eu realizava a chamada de uma SP do Oracle, podia perceber que a procedure estava sendo executadada no Servidor de Banco de Dados, o uso de memória e de processamento do meu servidor de aplicações permanecia praticamente inalterada, mas quando eu realizava a chamada das SPs no SQL Server tive a impressão de que ela estava sendo executada no servidor de aplicações e não no Servidor de Banco de dados, pois o uso de memória do Servidor de Aplicações subiu muito até esgostar a memória disponivel para o Java, que ja estava em 1,5GB.

    Meu servidor de aplicações possui outras responsabilidades, e eu preciso que essas SPs sejam executadas no servidor de banco de dados, pois ela popula varias tabelas com quase 2 milhões de registros quando são executadas, recuperando os dados de arquivos, e isso ficaria inviavel de ser feito no servidor de aplicações.

    Alguém saberia me dizer o que posso fazer para que essas procedures não consumam os recursos do meu servidor de aplicações, mas sim do servidor de banco de dados?

    Obrigado,

    Naresh Trivedi.



    • Movido Gustavo Maia Aguiar terça-feira, 7 de julho de 2009 21:00 (De:SQL Server - Desenvolvimento Geral)
    terça-feira, 7 de julho de 2009 18:48

Respostas

  • Naresh,

    Inicialmente sugiro verificar as configurações do componente utilizado para o acesso!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 8 de julho de 2009 13:12
    Moderador
  • Olá Naresh,

    Não posso afirmar sem ver, mas sinceramente acho que o problema não é de SQL Server. Não consigo imaginar como o SQL Server poderia sobrecarregar o cliente por conta da execução de Stored Procedures. Não há qualquer possibilidade arquitetural da Stored Procedure rodar do lado do cliente, pois, ela está no SQL Server e lá ela roda. Por isso desconfio (não posso afirmar, pois, meus conhecimentos em Java são limitados) que o problema esteja na camada de acesso à dados (por alguma razão desconhecida).

    Sugiro tentar o JTDs e ou retirar o ODBC como forma de "tentativa". Veja também a documentação do método CALL e tente outros métodos. Isso seria importante para tentarmos evidenciar se a camada de acesso a dados está provocando esse Overhead

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Certificados, Cross Database Ownership Chaining e Segurança
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!622.entry


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 8 de julho de 2009 15:26

Todas as Respostas

  • Boa Tarde,

    Toda Stored Procedure é executada no servidor de banco de dados. Não há como executá-la em outro local, visto que as regras estão ali definidas e só dizem respeito ao SQL Server. Seguramente elas estão sim consumindo recursos do banco de dados (isso pode ser evidenciado de várias formas).

    O que pode estar acontecendo é que uma arquitetura de acesso a dados e (ou) até um Driver mal configurado possa fazer com que os acessos ao SQL Server consumam mais recursos do servidor de aplicação retornando a esse resultsets muito grandes ou algo do tipo.

    Estou movendo o tópico para o fórum "SQL Server - Gerenciamento, Configuração, Instalação e Segurança", pois, essa dúvida não está diretamente relacionada a "SQL Server - Desenvolvimento".

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Certificados, Cross Database Ownership Chaining e Segurança
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!622.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 7 de julho de 2009 20:59
  • Naresh,

    É muito comum estas dúvidas em relação ao SQL Server e sua forma de operação quando se trabalha com um ambiente um pouco diferente como é o seu caso.

    Em relação a stored procedure, trata-se de uma funcionalidade que não é exclusiva do SQL Server, mas seu principal objetivo é flexibilizar a administração dos processos que devem fazer acesso ou manipulação de dados em grande demanda. Quando utilizamos uma stored procedure estamos trabalhando diretamente com o servidor SQL Server fazendo acesso as seus objetos, dados e definições. Toda e qualquer stored procedure fica armazenada diretamente em um banco de dados, o SQL Server utiliza todas as suas camadas internas para realizar a execução, validação e checagem da stored procedure, antes, durante e depois do seu processamento.


    Quando criamos uma stored procedure seu código fonte fica armazenada na área binária do SQL Server e sendo de exclusiva responsabilidade do SQL Server manté-la disponível, fazendo uso do plano de execução e query optimizer para melhorar ainda mais sua performance. Com o passar do tempo uma stored procedure fica armazenada na área de cache plan do SQL Server flexibilizando e acelerando ainda mais sua execução.

    No seu caso seria necessário verificar o componente que esta sendo utilizado para configuração do acesso ao SQL Server, como também as configurações que possam estar sendo passadas para sua aplicação.

    Você tem conhecimento se as estatísticas do seu banco de dados estão atualizadas?

    Como a sua aplicação realiza a chamada a esta stored procedure?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 8 de julho de 2009 00:06
    Moderador
  • Bom dia,

    Estou conectando no banco via JDBC/ODBC.

    A chamada da procedure é feita via comando CALL, mas a procedure não retorna nada à aplicação.

    Como não há retorno nenhum para a aplicação não teria como a memória estar esturando por causa de um resulset de retorno, outro detalhe importante é que o uso de memória no servidor de aplicações vai subindo gradativamente até ocorrer o estouro.

    Não sei dizer se as estatpisticas estão atualizadas, como posso verificar isso, Junior?

    Obrigado,

    Naresh Trivedi
    quarta-feira, 8 de julho de 2009 13:01
  • Naresh,

    Inicialmente sugiro verificar as configurações do componente utilizado para o acesso!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 8 de julho de 2009 13:12
    Moderador
  • Olá Naresh,

    Não posso afirmar sem ver, mas sinceramente acho que o problema não é de SQL Server. Não consigo imaginar como o SQL Server poderia sobrecarregar o cliente por conta da execução de Stored Procedures. Não há qualquer possibilidade arquitetural da Stored Procedure rodar do lado do cliente, pois, ela está no SQL Server e lá ela roda. Por isso desconfio (não posso afirmar, pois, meus conhecimentos em Java são limitados) que o problema esteja na camada de acesso à dados (por alguma razão desconhecida).

    Sugiro tentar o JTDs e ou retirar o ODBC como forma de "tentativa". Veja também a documentação do método CALL e tente outros métodos. Isso seria importante para tentarmos evidenciar se a camada de acesso a dados está provocando esse Overhead

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Certificados, Cross Database Ownership Chaining e Segurança
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!622.entry


    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 8 de julho de 2009 15:26