Infelizmente, os termos "ORM" e "problemas de performance" freqüentemente caminham juntos. Ao ocultar o SQL dos desenvolvedores, ORMs pode oferecer um aumento de produtividade enorme. Infelizmente, eles tornam mais fácil gerar consultas ridiculamente ruins, sem percebermos. Administradores de base de dados normalmente conseguem achar erros em códigos fazendo referência cruzada do stored procedure culpado com os códigos que o chama. Mas com o SQL gerado dinamicamente que os ORM dependem, esse truque raramente funciona. Então vamos dar uma volta em torno de algumas ferramentas para "profilling" de ORMs.
NHibernate
NHibernate Profiler (NHProf) inclui o que você esperaria de um produto básico. Além de manter estatísticas gerais, ele mostra uma lista de consultas recentes com o SQL completo e os "back-traces" que o codigo chama com seus "stack traces". A interface é limpa e bem referenciada, tornando mais fácil mudar de uma análise de consulta isolada, por exemplo, para todas as consultas utilizas em um bloco de código.
A melhor vantagem para NHibernate Profiler é recurso de alertas. Alguns alertas indicam problemas imediatos como erros de banco de dados ou usando acidentalmente uma sessão com varias threads. Outros alertas indicam a possibilidade de problemas como um grande numero de escritas individuais que provavelmente poderiam ser agrupadas dentro de um único lote. Existem também alertas que avisam sobre problemas que podem ocorrer no futuro como conjunto de resultados fora de limites.
Um conjunto de resultados sem limites é quando uma consulta é executada e não e' explicitamente limitado o número de resultados retornados usando setMaxResults () com NHibernate ou TOP ou cláusulas LIMIT no SQL. Normalmente, isso significa que a aplicação assume que uma consulta sempre retornará apenas alguns registros. Isso funciona bem em desenvolvimento e nos testes, mas é uma bomba-relógio prestes a explodir na produção.
O lado negativo do NHibernate Profiler é que ele é um pouco invasivo. Você não pode anexar a um processo em execução, tem que ser configurado por fora. Embora a maneira recomendada é a de incluir uma referência à NHibernate Profiler diretamente no seu código, os usuários do log4net também pode ativar o perfil através de uma configuração app.config.
NHibernate Profiler é um produto comercial que começa em cerca de US $ 300 dólares por usuário.
LINQ to SQL
DataContext logging é a primeira coisa que os desenvolvedores provavelmente vai considerar quando tiver olhando problemas de LINQ para SQL. O objeto DataConext tem uma propriedade de log que encaminha todos os SQLs que sao gerados para um TextWriter da sua escolha Apesar de livre e de graça, o grande volume de linhas de SQL que ele gera torna questionável o uso em aplicações não-triviais.
LINQ to SQL Profiler (L2SProf) é pela mesma empresa que construiu NHibernate Profiler e parece trabalhar de uma forma similar. Além de fazer profilling em tempo real, você pode configurá-lo para gravar os arquivos de log a ser analisado posteriormente. Como NHProf, o valor é de cerca de US $ 300 dólares por usuário. Atualmente ele está em fase beta.
Huagati Query Profiler é outro profiler invasivo. Eles dizem que o “componente runtime são feitos para serem integrados e distribuídos com aplicações que usam tanto o Linq-para-SQL, ou LLBLGen Pro para acessar o SQL Server.” Felizmente o Profiler pode ser ligado e desligado em tempo de execução, conforme necessário.
A interface de usuário para Huagati é totalmente arcaica. É constituída uma grande grid que toma conta de metade da tela com os SQLs e stack traces abaixo dela. Falta-lhe todas as minúcias que NHProf / L2SProf tem como alertas e tela de informações, mas ele tem uma característica atraente para o desenvolvedor de baixo nível, o detalhe.
O Profiler da Huagati é não informa apenas durações absolutas e contagens de linha, realmente vai fundo e tira todas as informações que o SQL Server disponibiliza.Em vez de apenas ver o tempo de reposta, você começa a ver as informações importantes, como quanto tempo foi gasto com a compilação da consulta versus tempo de execução. Leituras e escritas (E/S) estão inclusas e você ainda pode ver o plano de execução.
Huagati Query Profiler é um produto comercial, que começa em US $ 50 dólares para uma versão limitada e US $ 120/usuário para a versão completa.
ADO.NET Entity Framework
A história aqui é francamente lamentável. Primeiro de tudo, nvocê nem tem o log de SQL básico, como o que está disponível no LINQ para SQL. Além disso, parece que ninguém está desenvolvendo profilers para trabalhar com ele.
Conclusões
Há uma abundância de outros ORM frameworks para .NET, mas todas elas estão praticamente no mesmo barco, como ADO.NET Entity Framework. Além de apoiar as duas ferramentas de profilers mencionados aqui, há pouco ou nenhum suporte para você usar o profiler "built-in" do banco de dados.