每当尝试执行查询时,查询管道将查找其查询计划缓存,以查看确切的查询是否已编译并可用。 如果是这样,它将重复使用缓存的计划,而不是生成一个新计划。 如果在查询计划缓存中找不到匹配项,则会编译并缓存查询。 查询由其实体 SQL 文本和参数集合(名称和类型)标识。 所有文本比较都区分大小写。
配置
查询计划缓存可通过 EntityCommand..
若要启用或禁用查询计划缓存 EntityCommand.EnablePlanCaching,请将此属性设置为 true
或设置为或 false
。 为单个动态查询禁用计划缓存,这些查询在提高性能后不太可能再使用。
可以通过 .. 启用查询计划缓存 EnablePlanCaching。
建议的做法
通常应避免动态查询。 以下动态查询示例容易受到 SQL 注入攻击,因为它直接采用用户输入而不进行任何验证。
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;
如果确实使用动态生成的查询,请考虑禁用查询计划缓存,以避免对不太可能重复使用的缓存项使用不必要的内存消耗。
静态查询和参数化查询上的查询计划缓存可提供性能优势。 下面是静态查询的示例:
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";
若要使查询与查询计划缓存正确匹配,它们应符合以下要求:
查询文本应为常量模式,最好是常量字符串或资源。
EntityParameter 或 ObjectParameter 应该在必须传递用户提供的值的位置使用。
应避免以下查询模式,这些模式在查询计划缓存中不必要地使用槽:
文本中字母大小写的更改。
更改空格。
对文本值的更改。
对批注内文本的更改。