Armazenamento em cache do plano de consulta (Entity SQL)
Sempre que uma tentativa de executar uma consulta é feita, o pipeline de consulta pesquisa seu cache do plano de consulta para ver se a consulta exata já está compilada e disponível. Em caso afirmativo, reutiliza o plano armazenado em cachê em vez de criar um novo. Se uma correspondência não for encontrada no cache do plano de consulta, a consulta é criada e armazenadas em cachê. Uma consulta é identificada pelo texto Entity SQL e pela coleção de parâmetro (nomes e tipos). Todas as comparações de texto diferenciam maiúsculas de minúsculas.
Configuração
O cachê do plano de consulta é configurável com EntityCommand.
Para ativar ou desativar a consulta planejar o cachê com EntityCommand.EnablePlanCaching, defina essa propriedade como true
ou a false
. Desativar o cachê de fundo para consultas dinâmicos individuais que são improvável de ser usado mais uma vez em melhora o desempenho.
Você pode ativar o cachê do plano de consulta com EnablePlanCaching.
Prática recomendada
Consultas dinâmicos devem ser evitadas, geralmente. O exemplo a seguir dinâmica de consulta é vulnerável a ataques de injeção SQL, porque recebe entrada do usuário diretamente sem qualquer validação.
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;
Se você usar consultas gerados dinamicamente, considere desativar o cachê do plano de consulta para evitar desnecessário consumo de memória para as entradas de cache que são improvável de ser reutilizado.
Consulte o cachê de fundo em consultas estáticos e consultas parametrizadas podem fornecer benefícios de desempenho. A seguir está um exemplo de uma consulta estático:
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";
Para que as consultas são igualadas corretamente pelo cache do plano de consulta, devem estar de acordo com os seguintes requisitos:
O texto da consulta deve ser um padrão constante, de preferência um cadeia de caracteres constante ou um recurso.
EntityParameter ou ObjectParameter devem ser usados em qualquer lugar que um valor de fornecido deve ser passado.
Você deve evitar os seguintes padrões de consulta, que consomem desnecessariamente slots no cache do plano de consulta:
Alterações em caso de letra em texto.
Alterações no espaço em branco.
Alterações em valores literais.
Alterações ao texto dentro de comentários.