.NET

22 nov, 2017

Query Compiled no EntityFrameworkCore 2.0

366 visualizações
Publicidade

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