Ouvi em um podcast que não existem ORMs que tenham uma boa solução para reutilização do plano de execução. Isso levará ao aumento do cache do plano de execução, o que afeta o desempenho.
- Como o NHibernate lida com o plano de execução?
- O plano de execução é reutilizado no NHibernate?
Para responder à sua primeira pergunta, o NHibernate não lida com planos de execução. O SQL Server lida com planos de execução. Se o SQL dinâmico produzido pelo NHibernate for parametrizado, os planos serão classificados como "Preparados" e serão reutilizados assumindo que os parâmetros fornecidos em cada execução subseqüente podem produzir o mesmo plano de consulta otimizado. Se o SQL dinâmico não for parametrizado, o plano de execução será classificado como "Adhoc" e ainda poderá ser reutilizado.
Eu uso esse bit de T-SQL para monitorar tamanhos de cache para vários planos de consulta. Acho que copiei isso do site de Paul Randal (http://www.sqlskills.com/BLOGS/PAUL/), mas já faz tanto tempo que não tenho mais certeza.
Os ORMs geralmente não são o problema em si, é como eles são usados. O SQL Server gera o plano de execução. O NHibernate pode gerar uma consulta que faz com que o SQL gere um plano de execução incorreto. Se você usar variáveis em suas consultas, os planos de execução poderão ser reutilizados. A concatenação de strings geralmente impede a reutilização do plano. Veja esta pergunta para mais informações.
Além do problema de parametrização já mencionado, todos os ORMs podem gerar planos realmente ruins. Isso é feito com mais frequência quando há muitas opções de pesquisa, causando uma cláusula WHERE realmente grande na consulta do SQL Server, que está cheia de instruções OR com as quais o SQL Server não pode fazer muito.