Neste post gostaria de descrever alguns procedimentos importantes para execução de queries via Entity Framework 5. Acredito que a explicação do funcionamento e da existência destes procedimentos pode ajudar na resolução de cenários mais avançados e no entendimento do funcionamento do Entity Framework.
Cold e Warm Queries
A primeira vez que uma query é executada, o Entity Framework executa muito trabalho para carregar e validar o modelo de dados utilizado.
Essa primeira query é chamada de "Cold query" (consulta fria), pois ela ainda não validou e carregou dados do modelo. Quando esta query é executada novamente, então ela é chamada de "warm query" (consulta morna), que faz proveito dos dados do modelo carregados e validados da primeira query, tornando sua execução mais rápida – isso justifica parte da impressão de que “a segunda execução sempre é mais rápida”.
Existem alguns componentes importantes na compilação das queries, tal como a criação de Mapping Views.
Mapping Views, View Generation e Plans Compilers
Mapping Views são representações executáveis utilizadas para: execução de queries (query view), adequa o modelo do banco de dados ao modelo conceitual e execução de updates (update view), adequa o modelo conceitual ao modelo do banco de dados.
O processo de criação destas views é chamado de View Generation. Sempre que uma view é criada também é validada (modelo conceitual e banco de dados), a fim de garantir sua integridade entre os dois modelos, assegurando que o relacionamento e a cardinalidade entre as entidades realmente faz sentido.
Quando uma consulta é feita sobre uma entidade, a consulta é combinada com sua respectiva query view. O resultado desta combinação é então executado pelo Plan Compiler, para criar uma representação que a fonte de dados possa entender. Diferentes fontes de dados possuem resultados diferentes em seus Plan Compilers. Por exemplo, para o SQL Server o resultado final do Plan Compiler será código T-SQL.
A figura abaixo descreve o processo de compilação e execução de consultas em bancos de dados por meio da engine do Entity Framework.
O desempenho da criação de views depende da quantidade de relacionamentos, tamanho do modelo e a complexidade do modelo.
Cache
Diferentes usos de cache são adotados no Entity Framework, alguns deles são:
Object Caching é um cache de primeiro nível que mantém embutido no ObjectContext instâncias dos objetos retornados em consultas. Este cache é existente apenas no nível do ObjectContext.
O Query Plan Caching armazena comandos (gerados pelo Plan Compiler) que são executados mais de uma vez. A primeira vez que uma query é executada, ela passa pelo Plan Compiler para que crie uma representação que a fonte de dados possa interpretar. Com o Query Plan Caching, a próxima vez que a query for executada ela não passará pelo Plan Compiler, apenas buscará os dados no Query Plan Caching, reaproveitando processamento e evitando a reexecução do Plan Compiler. Este cache existe em nível de AppDomain, isto significa que a cada conexão aberta e/ou ObjectContext (ou DbContext) criado, este cache será único, pois sua existência esta associada a vida útil do AppDomain da aplicação.
Metadata Caching é muito importante, pois mantêm em memória os tipos de dados do modelo e informações do mapeamento entre o modelo conceitual e o modelo do banco de dados. Este também é um cache em nível de AppDomain.
A figura abaixo descreve o processo de compilação e execução de consultas em bancos de dados por meio da engine do Entity Framework fazendo uso dos recursos de cache.
Espero que este post seja útil para o entendimento do funcionamento interno do EF.
Obrigado e bons estudos!
Por
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#
Referências:
http://msdn.microsoft.com/en-us/data/hh949853.aspx
http://www.devproconnections.com/article/entity-framework/entity-framework-5-143875
Programming Entity Framework – Julia Lerman
Programming Entity Framework DbContext – Julia Lerman & Rowan Miller
LINQ – Pocket Reference – Ben Albahari & Joseph Albahari
Agradecimentos:
@MaiconFGuerra e @MayogaX pela leitura e opinião sobre o texto. Obrigado!