quarta-feira, 4 de agosto de 2010

Mitos sobre Stored Procedures, uma análise

Quer ler o PDF deste post, baixe aqui.

Recentemente o Giggio escreveu um post intitulado “Mitos sobre Stored Procedures” e até me mandou um tweet dizendo “Alguma coisa a completar sobre o que escrevi?!”. Somente hoje consegui parar e fazer uma análise crítica do post e das respostas, então resolvi colocar tudo em forma de post.
Antes de continuar escrevendo, gostaria de ressaltar meu posicionamento sobre o assunto e exemplificar com o Entity Framework, que é o ORM que eu conheço um pouco. 
  1. Sou a favor de frameworks ORMs. Isso mesmo, um SQLGeek falando isso! Gosto da idéia de abstrair a complexidade de bancos relacionais através de um modelo de entidades e permitir que o desenvolvedor possa utilizar o LINQ to Entities (por exemplo), que será traduzido para um T-SQL ou PL-SQL. 
  2. Não acho que ORM é a solução para todos os problemas. Vejo ORMs principalmente para aquelas aplicações (ou parte delas) que fazem manipulações simples de entidades com pequenas massas de dados, CUD ou consultas com um ranking, agrupamentos e outras operações set-based simples. Isto é, para operações data intensive (ex.: fechamento de um processamento diário ou cálculo de premiação mensal) você não vai querer um tráfego gigantesco de dados entre o banco e sua aplicação, só para manter a regra de negócio em um só ponto. 
  3. Programar regras de negócio em C# é mais fácil que em T-SQL. Senhores, T-SQL é uma linguagem restrita para escrita regras de negócio, prefiro 1000 vezes escrever minha lógica em C#. Exemplo bobo, faça um try/catch no T-SQL que acabe em um rethrow da exceção... Eu já tenho a minha proc_Rethrow, e você? 
    1. T-SQL é muito poderoso e eficiente dentro de seu objetivo primário, manipulação de conjunto de dados.
  4. Lixos T-SQL espalhados por aí. Essa é minha maior preocupação, se 70% dos desenvolvedores escrevem código C# ruim, 95% dos devs escrevem consultas T-SQL horríveis. E isso, desculpem o termo, FODE com o banco de dados e aplicação! Deixando de lado os problemas do EF V1 na geração de T-SQL, o EF 4.0 é bem mais eficiente e prefiro 1000 vezes a tradução do e-SQL do EF feito por uns indianos malucos (piadinha, ok?!) a deixar nossos desenvolvedores escreverem as consultas.
    1. Sim, talvez seja preconceito. Certa vez estava em uma apresentação sobre ORMs uma pessoa disse: “eu não quero pagar esse overhead de X milisegundos de tradução do EF porque todas as minhas consultas são bem escritas”. Bom, eu erro, e a menos que você seja um programador T-SQL fodístico-mega-flawless como esse camarada, um ORM pode ajudar.

 Agora a análise dos pontos que o Giggio citou: 
  1. Concordo em geral. Planos ficam guardados, tanto de consultas ad-hoc quanto de procedimentos e sim, existe statement level recompilation a partir do 2005. O SQL Server desde versões anteriores tenta fazer uma auto-parametrização das suas consultas ad-hoc, mas ele somente conseguirá fazer isso se a sua consulta possibilitar que um mesmo plano possa ser reutilizado de forma segura para TODOS os parâmetros possíveis. 
  2. Não é um mito, SP estimula a reusabilidade no contexto do banco de dados. O que eu concordo é que existem outras maneiras, possivelmente mais eficientes de atingir esse objetivo.
  3. Mesmo do item 2, não é um mito no contexto de banco de dados, mas posso aproveitar bem minha aplicação para isso.
  4. Discordo. No SQL Server existe uma coisa chamada ownership chaining, que permite criar um cenário onde um usuário não tenha acesso direto a tabela (nada de selects ou CUDs na tabela) e através de uma procedure com mesmo “dono” o usuário com permissão de EXEC na proc possa chegar a tabela. É uma característica que nos permite um bom controle.
    1. Não vou entrar em detalhes aqui das aplicações mal desenvolvidas. Quero me jogar da janela toda vez que alguém vai instalar um novo software e o camarada me pede: preciso de SA ou dbowner. Normalmente isso acontece porque a empresa que desenvolveu o software não utilizou o princípio de desenvolver com menor privilégio possível e não sabe (isso mesmo, é ignorância sobre seu próprio software) quais são as reais permissões necessárias. AAARRRGGGHHH.
  5. É uma verdade, só acho que esse é um argumento ridículo em termos de otimização. Se você está falando que seu ambiente está tão otimizado que você está considerando esse ganho ínfimo, por favor, me chame para conhecer seu ambiente que faço uma revisão grátis da saúde do SQL Server (agora, se eu encontrar um problema maior, cobro em dobro as horas, ok?). 
Sinceramente, eu acho que a discussão tem que sair um pouco do plano do mito (isso é bom para incentivar uma guerrilha :-)), mas sim no seguinte: eu posso fazer algumas dessas coisas de forma mais eficiente ou, tão-eficiente quanto, usando essa outra abordagem: ORM.

Alguns comentários sobre os comentários... 
  • ETL – Esqueçam ETL x ORM, não trabalham juntos. Reporting não é ETL. Realmente não entendi essa viagem sobre ETL. Seu ORM ou SP garantem que o dado JÁ está consistente com a regra de negócio no banco de dados, dados consistentes é isso que eu preciso, agora me deixem em paz que eu vou trabalhar diretamente com os dados, seja para uma carga de DW ou outra coisa, ponto final.
    • E DUVIDO que alguém vai ficar no SSIS customizando um script component como source só para reutilizar uma DLL com um EF lá dentro (exmeplo). Não me parece muito esperto não...
  • Gostei das respostas do Ronaldo Tolentino. A realidade hoje é outra e temos muito legado, então regras dentro de SPs permitem que diferentes sistemas estejam em acordo e eu possa mudar a regra em somente um lugar.
    • Sei que posso usar uma DLL, refazer a distribuição entre aplicações diferentes, carregá-la dinamicamente no AppDomain, MAS, caímos na questão da manutenção. Tenho expertise para tal? Como vou controlar as diferentes versões dos diferentes sistemas? A troca da DLL trará um efeito colateral?
    • Discordo do Giggio quando ele diz que existem maneiras mais simples, existem sim outras maneiras, mas a facilidade é um termo subjetivo de acordo com nossa experiência.
  • A frase “No banco de dados, a unica coisa que vc otimiza é as procedures, agora na aplicação vc tem inumeras arquiteturas q lhe possibilitam isso”.
    • Ah Danimar, Danimar, se fosse só isso eu estaria desempregado... 

Conclusão: DEPENDE!
É idiota, mas verdade. A diferença está quando você responde “depende” sabendo analisar criticamente seu cenário ou quando você responde depende e começa a falar bobagens. Vocês podem ficar brigando dias e dias, mas o que serve para um pode ser horrível para o outro.  
Não sou purista e hoje trabalho com uma abordagem híbrida. Utilize seu ORM para aquele “front-end básico de BD” (90% da aplicação que o desenvolvedor júnior consegue programar) e quando houver relatórios em tempo real ou operações complexas que sejam data intensive, coloque em SPs e apresente isso como uma função na entidade mais adequada. Sem dor. 
No mais gostei do post e das discussões, bom para aquecer um início de dia...
 
[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
http://www.srnimbus.com.br/

5 comentários:

  1. Ótimo post Luti no meu caso faço como vc mostrou utilizo ORM para as funções mais básicas e crio algumas procedures para funções + grandes de processamento. Depende muito de como usar, quando usar e pra que usar.

    ResponderExcluir
  2. Fala Luti, como eu comentei no post do Giggio, acho sim que um sistema ORM tem seu espaço. Da mesma forma que as SP também tem. Existem casos onde uma solução é mais performática que outra, e casos que uma consulta AD-HOC ridícula resolve o problema (não me joguem pedras, rss)!

    Não tenho o que complementar ou causar polêmica, vejo que cada solução, se ber arquitetada, tem seu espaço. Só não devemos ser radicais ao ponto de deixar de utilizar uma solução ou outra que NOS ATENDE por questão de modismo. :)

    Abraço,
    Diego Nogare

    ResponderExcluir
  3. Boa tarde Luti.

    Como comentei no blog do próprio Giovanni, concordo com a abordagem do Diego. Eu mesmo já encontre cenários em que uma ou outra abordagem era mais interessante naquele caso.

    Até mais.

    ResponderExcluir
  4. Blá blá blá... Primeiro é necessário saber bem o que é para ser feito. Segundo decidir como fazer, métodos e tecnologia e então vamos para a otimização. E otimizamos até quando o custo compensar o benefício. Perdi meu tempo lendo este post e pior porque não resisti deixar de comentar tantos blá blá! Foi mal, mas minha expectativa foi maior do que eu li. Abraços.

    ResponderExcluir
  5. Realmente pessoal, não é questão de modismo ou tecnologia, no fim das contas temos que atender ao negócio.

    Oi Anônimo?! realmente é necessário saber bem o que é para ser feito! O problema hoje é que temos desenvolvedores que não sabem nada de banco de dados e DBAs que não sabem nada de desenvolvimento, então como eles poderão decidir - com certo grau de acerto - como fazer (métodos e tecnologias)?

    Não acho que devemos gastar tempo otimizando pequenos detalhes e focar no que vai nos dar um maior resultado, eu sempre disse isso para todos e ficou claro no meu post quando digo que o item 5 é um argumento ridículo de otimização pelo ganho que vai trazer (você leu essa parte?).
    Aqui Pareto é nosso amigo.

    E se me permite, vou discordar quando você diz: métodos, tecnologia e então vamos para a otimização. Será que você também acredita que devemos construir um sistema e DEPOIS pensar em segurança? O mesmo princípio se aplica aqui, não preciso fazer "tuning pesado" desde o início do projeto, mas se fizermos toda uma arquitetura SEM PENSAR em questões importante como desempenho e segurança, pode ser que no fim do projeto erros dos de arquitetura (aplicação ou banco) inviabilizem uma otimização decente e fruste o usuário final.
    Pense nisso...

    []s
    Luti

    ResponderExcluir