查询计划缓存 (实体 SQL)

每当尝试执行查询时,查询管道将查找其查询计划缓存,以查看确切的查询是否已编译并可用。 如果是这样,它将重复使用缓存的计划,而不是生成一个新计划。 如果在查询计划缓存中找不到匹配项,则会编译并缓存查询。 查询由其实体 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";

若要使查询与查询计划缓存正确匹配,它们应符合以下要求:

  • 查询文本应为常量模式,最好是常量字符串或资源。

  • EntityParameterObjectParameter 应该在必须传递用户提供的值的位置使用。

应避免以下查询模式,这些模式在查询计划缓存中不必要地使用槽:

  • 文本中字母大小写的更改。

  • 更改空格。

  • 对文本值的更改。

  • 对批注内文本的更改。

另请参阅