Essa é uma abordagem que eu particularmente amo: performance. Sou apaixonado pelo assunto e quando se trata de acesso à dados, chama ainda mais minha atenção.
Porque tempo é precioso.
O procedimento padrão no EntityFrameworkCore é fazer uma varredura por expressões, ou seja, ele lê o código escrito, transforma em Expression (In Runtime) e depois ele traduz o SQL que faz a leitura das informações no banco.
Bem, na verdade, o que quero mostrar é um pequeno comparativo entre uma consulta normal e uma consulta realizada através de uma query compilada. Esse recurso foi disponibilizado na versão 2.0, que o EF.CompileQuery. Irei utilizar o SQL Server 2016 neste exemplo.
Abaixo está toda classe que foi utilizada para executar os testes. A diferença é visivelmente animadora. Minha sugestão para quem executa diversas consultas, é utilizar as Querys Compiladas, o ganho de performance é empolgante. Neste exemplo, de 500 interações, obtivemos um ganho de mais 35%.
Tempo de execução
Query normal | 1145 ms |
Query compilada | 784 ms |
Link para o código: https://gist.github.com/anonymous/dcd4f329dc9dbb4f3f5b05ce00fe1a9b
O segredo pra tudo isso acontecer está nesse trecho:
EF.CompileQuery((IMastersContext db, string id) => db.Pessoas.Single(c => c.Senha == id));
O que acontece, na verdade, é que o EntityFrameworkCore compila a instrução e otimiza em memória, pra não ser necessário rescrever em cada chamada. Fazendo comparações apenas do hash da consulta. Com isso ganhamos performance.
Pessoal por hoje é só isso. Minha intenção foi mostrar que podemos ter mais performance com esse ORM, que a cada dia cresce mais. Na próxima versão do EF Core teremos muitas novidades. Uma delas é EF Core for Oracle, que tive o prazer de fazer algumas contribuições para o projeto, como Inserção em Lote, Engenharia Reversa (Scaffolding) e outras coisas legais.
Abraços! #TJ