rbfigueira
Tudo sobre a plataforma .net em Português ;)

Sei que este tema é um pouco controverso mas... aqui vai :p

Existem dois modelos de design diferentes para o acesso a uma base de dados:

1 - Guardar todas as instruções SQL dentro de stored procedures (usando apenas o objecto SqlCommand para executar os stored procedures pelo nome);

2 - Guardar todas as instruções SQL como texto (usando os objectos SqlCommand).

Se forem daqueles (como eu)  que lêem muito, poderão ver muitas referências em que se diz que os stored procedures têm melhor performance porque são "pre-compilados" e residem na memória "cache in-memory" pelo SqlServer. Entretanto muitos artigos e livros esquecem-se de referir que isto também acontece com queries em SQL text (algo que, já alguns anos, foi adicionado ao SQL Server) desde que usem queries parametrizados (deverão fazer isto em todos os casos pois em termos de segurança reduz os ataques "SQL-injection")  !

A performance entre os Stored Procedures e os SQL text queries é similar em muitos casos.  No entanto não se esqueçam que o nome do Stored Procedure é bastante mais pequeno comparado com um query SQL text, então será sempre mais fácil para o "motor" do SQL Server encontra-lo no seu plano de execução "cache".... mas mesmo assim em muitos casos isto também não é muito significativo.

Existem muitos prós e contras nos dois casos.  Os stored procedures permitem um controlo maior em termos de segurança pois podemos dar permissões a um user (SQL user account) para executar apenas certos stored procedures, não dando um controlo total sobre as tabelas existentes. Outro argumento a favor é o facto de que usualmente os stored procedures têm um "batch" de instruções e não apenas uma instrução. Se tiverem que executar  usando SQL text queries então teremos que executar múltiplos comandos separados que faz fazer com que aumente o tráfico na rede. Quando executamos um Stored Procedure o tráfego é mínimo pois apenas enviamos um nome e alguns parâmetros :p

Apesar disto tudo (e apenas fiz uma simples abordagem) os stored procedures nem sempre são a melhor solução! A grande vantagem dos SQL text queries é que são mais flexíveis! Por vezes queremos implementar sistemas de filtros e busca no UI em que o utilizador pode "parcialmente" preencher alguns dados e escolher os campos. O query é diferente dependendo dos campos escolhidos e preenchidos pelo utilizador e até a sua ordenação. Se tivessem que fazer isto dentro de um Stored Procedure teriam de escrever muitas instruções IF...ELSE o que se poderia tornar elegível. Outro grande problema é se queremos ter a possibilidade de suportar diferentes tipos de base de dados. Neste caso temos de "converter" todos os stored procedures. Isto é mesmo necessário porque os vários RDBMSs têm uma linguagem diferente apesar do seu "SQL dialecto" ser muito próximo do standard das especificações do ANSI SQL.

Então, que solução utilizas ?

Por norma prefiro usar o "Provider Model Design pattern" e a criação de diferentes RDBMS - DAL classes. Usar o provider model design nem sempre é a solução mais fácil de implementar se existirem muitos RDBMS a suportar mas vantagens são superiores ás desvantagens.

O resultado destes argumentos é que por norma utilizo os stored procedures para trabalhar com os dados da base de dados, excepto quando o query  é demasiado dinâmico e complexo para usar nos stored procedures. Nessa situação uso sempre SQL text queries usando SqlCommand e SqlParameters, é claro :P

posted on Thursday, August 17, 2006 12:16 AM
Comments
  • # re: Stored Procedures vs SQL Text Queries
    Pedro Sousa
    Posted @ 8/17/2006 1:35 AM
    Olá Ricardo,

    Foste buscar um tema muito pouco consensual ao baú :D.

    Falando por mim, opto por uma abordagem diferente.
    Antes de mais tenho a seguinte métrica: "se tem lógica de negócio não coloco num stored procedure". Com isto procuro manter a coesão do modelo e as águas separadas.

    Além disso, creio que os stored procedures só são vantajosos ao nível de performance, pelo que, caso não tenhamos nenhum "engarrafamento", não vejo necessidade de se proceder à sua utilização.
    Só num caso de optimização premente é que os considero, visto ser realmente fácil
    refactorizar o código para os incluir.
    É importante programar com a optimização em mente, mas não fazer disso o nosso cavalo de batalha (claro que cada caso é um caso) já que o ciclo de vida de um projecto é um conjunto de tradeoffs (como todos muito bem sabemos).


    Quanto à DAL, também evito utilizar, pelo menos no sentido tradicional da coisa. Isto porque gosto de utilizar um Domain Model, e manter a DAL "sincronizada" com o modelo pode ser complicado à medida que o sistema ganha complexidade, pelo que mantenho a lógica de acesso à BD nos próprios objectos (possivelmente utilizando uma classe intermédia como facilitador - genéricos anyone?).

    Abraços,
    Pedro
  • # re: Stored Procedures vs SQL Text Queries
    Joao Cardoso [MVP]
    Posted @ 8/17/2006 3:35 AM
    Este assunto é realmente bastante debatido. Alguns pontos extra.

    Se a tua DAL for suficientemente inteligente podes alterar os resultados do teus queries no SP sem que tenhas de mecher na DAL ou na aplicação. Um bom exemplo é em reporting.

    Outra coisa que a malta se esquece é que uma SP também tem uma vantagem sobre as Text Queries... o trabalho pode ser dividido entre o pogramador e o administrador de bases de dados.

    Quem le este post pode pensar que estou a defender as SP sobre as text queries. Nada disso. Cada macaco no seu galho. Isto é, as text queries podem ter o seu lugar assim como as SP. E alguem defender uma unica em deterimento da outra só pode ser entendido como alguma falta de conhecimento.

    Meu lema é... usar a ferramenta certa para o trabalho certo. Até à uns anos atraz apostava muito mais em text queries. A tendencia agora é apostar cada vez mais em SP ate mesmo para CRUD. Mas a Text Queries ainda têm o seu lugar.

    Pesquisas com condições dinamicas é um bom exemplo. Se bem que tenho SPs que ja fazem isso tb. Obviamente que dao mais trabalho e nao... nao uso if if if if..... ;)
  • # re: Stored Procedures vs SQL Text Queries
    Luis Abreu
    Posted @ 8/17/2006 3:38 PM
    La vou eu ter de discordar...na minha opiniao, CRUD = SQL nos meus objectos.
  • # re: Stored Procedures vs SQL Text Queries
    Paulo Morgado
    Posted @ 8/17/2006 7:18 PM
    Eu defendo a utilização exclusiva de SPs pelas razões já apresentadas pelo Ricardo e João Cardoso.

    Por um lado, temos segurança acrescida porque não damos acesso directo a nenhuma tabela - segurança.

    Por outro lado, temos uma miniDAL que nos permite expor um modelo de dados para a aplicação diferente do que está, efectivamente na base de dados, podemos registar automaticamente todos os acessos, etc.

    Se estivermos a falar de SQL Server 2005, podemos ainda expor SPs como Web Methods de um Web Service e expor, directamente, serviços a outras aplicações que usem a base de dados.
  • # re: Stored Procedures vs SQL Text Queries
    Luciano Leston
    Posted @ 8/17/2006 8:26 PM
    Concordo com o Paulo Morgado. Sei que não se pode evidentemente pensar apenas em performance, mas desde já acrescento que o uso de SPs não só melhora o desempenho (text queries só são cacheables dentro da mesma session ID) quanto garente que as regras de determinado processo serão as mesmas dentro de todo o banco.
    Quando usamos text queries corremos o risco de ter de atualizar diversos pontos do aplicativo, além da costumeira intenção de mexer um pouquinho na minha query para ela se adaptar ao contexto (mesmo quando são desemvolvidas classes para a camada de negócios)
    Com SPs temos garantia de segurança, performance e integridade de processos. Eu recomendo aos desenvolvedores a evitarem as text queries sempre que possível. Com respeito a queries complexas também gostaria de ressaltar que muitos RDBMS (SQL Server e Oracle por exemplo) permitem o uso de queries dinâmicas e a parametrização de filtros.
  • # re: Stored Procedures vs SQL Text Queries
    rbfigueira
    Posted @ 8/17/2006 9:54 PM
    Oi amigos,

    Eu logo vi que este tema era um pouco polémico. Apesar de já ser muito debatido pela web fora achei por bem relembrar :)

    Este foi um post sobre Stored Procedures vs SQL Text Queries ... imaginem se metermos ao "barulho" O/RM tools como o NHibernate for .NET :P Tenho k fazer um post sobre isto :p


    Nota:
    Luciano,

    Enviaste-nos um email mas não te conseguimos responder porque o teu email é sempre devolvido....dá sempre erro:

    Original-Recipient: RFC822; <luciano.leston@uniceub.br>
    Final-Recipient: RFC822; <luciano.leston@uniceub.br>
    Action: failed
    Remote-MTA: DNS; taurus.ceub.br
    Last-Attempt-Date: Thu, 17 Aug 2006 18:44:27 +0100

    ----- Os seguintes endereços apresentam erros fatais permanentemente ----- <luciano.leston@uniceub.br>
  • # re: Stored Procedures vs SQL Text Queries
    Eduardo Xavier
    Posted @ 8/26/2006 12:33 AM
    Olha, esse é um assunto delicado normalmente levantado por pessoas com baixo intelecto computacional. Sem ofensas, porque ninguém conhece tudo nesse mundo!

    Ad hoc queries (SQL Text Queries) podem até ser mais flexíveis se você quiser pensar assim. Usar ad hoc queries fazendo if/them/else pra incluir ou excluir campos baseados em parâmetros numa instrução SQL, é desnecessário e degrada a manutenção.

    Se você têm um formulário com inúmeros campos que servem como parâmetros de consulta, use algo como:
    "WHERE
    (
    campo1 = parametro1
    or
    parametro1 = (valor padrao, normalmente zero ou branco)

    and
    (
    campo2 = parametro2
    or parametro2 = ""
    )
    and
    (
    (campo3 = parametro3
    or parametro3 = 0)
    or //isso funciona como um if [parametro3 = 5]
    (
    campo3 = parametro3
    and
    parametro3 = 5 )
    )"



    Dentro de uma where é possível fazer construções de consultas idênticas ao que você faria com uma ad hoc query normal usando if/them/else. Eu trabalho assim com MySQL, IBM DB2/400 e SQL Server tranquilamente. O tempo de resposta é o mesmo e a manutenção melhor ainda!

    Stored procedure é melhor sim!
    Reduz o código da aplicação, separa e organiza camadas, diminui possibilidades de eventuais erros de instrução sql ou acidentes, reduz tráfego na rede é um fator positivo para manutenção.
  • # re: Stored Procedures vs SQL Text Queries
    Ricardo Fiel
    Posted @ 9/2/2006 1:29 PM
    No seguimento deste post, podemos voltar a discussão para outro assunto nada pacífico: typed datasets ou custom business objects?

    No meu caso, normalmente, uso custom objects. Apenas quando a lógica de negócio é demasiado simples, é que fico pelos datasets.

    Qual é a vossa opinião?

Title  
Name  
Url
Box Code
Protected by FormShield
Comments